JVM面试FAQ分析

2023-11-18

JVM面试FAQ分析

1. 入门部分

1.1为什么要学习JVM?

可以帮助我们从平台角度提高解决问题的能力,例如:

  1. 有效防止内存泄漏(Memory leak).
  2. 优化线程锁的使用 (Thread Lock).
  3. 科学进行垃圾回收(Garbage collection).
  4. 提高系统吞吐量(throughput).
  5. 降低延迟(Delay),提高其性能(performance).

1.2 你了解哪些JVM产品?

  1. HotSpot VM(Sun/Oracle JDK和Open JDK的默认虚拟机)
  2. JRockit VM
  3. J9 VM
  4. TaobaoVM
  5. Dalvik VM

1.3 JVM的构成有哪几部分?

  1. 类加载系统 (ClassLoader System): 负责加载类到内存.
  2. 运行时数据区(Runtime Data Area): 负责存储数据信息(对象、方法等).
  3. 执行引擎(Execution Engine): 负责解释执行字节码、执行GC操作等.
  4. 本地库接口(Native Interface): 负责融合不同的编程语言为 Java 所用.

2. 类加载部分

2.1 你知道哪些类加载器?

  1. BootStrapClassLoader(根/引导类加载器):java的核心类库都是使用引导类加载器进行加载的
  2. ExtClassLoader(扩展类加载器):该类加载器负责加载java的扩展库或者java.ext.dirs路径下的内容
  3. AppClassLoader(应用/系统类加载器):对于用户自定义的类来说,默认使用这个类加载器加载

2.2 什么是双亲委派类加载模型?

如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式.父类加载器一层一层往下分配任务,如果子类加载器能加载,则加载此类,如果将加载任务分配至系统类加载器也无法加载此类,则抛出异常.

2.3 双亲委派方式加载类有什么优势、劣势?

  • 优势:
    1. 避免类的重复加载,确保一个类的全局唯一性
    2. 保护程序的安全,防止核心API被随意篡改
  • 劣势:
    1. 父级加载器无法加载子级类加载器路径中的类

2.4 描述一些类加载时候的基本步骤是怎样的?

  1. 通过一个类的全限定名(类全名)来获取定义的二进制字节流
  2. 将这个字节流所代表的静态存储结构转化为方法区的进行时数据结构
  3. 在Java堆中生成一个代表这个类的Java.lang.Class对象,作为方法区中这些数据的访问接口

2.5 什么情况下会触发类的加载?

类加载方式主要有两种:隐式加载和显示加载

  • 隐式加载:
    1. 调用静态成员时,会加载静态成员真正所在的类及其父类,通过子类调用父类的静态成员时,只会加载父类而不会加载子类.
    2. 第一次new对象的时候加载(第二次在new同一个类时,不需要再加载).
    3. 加载子类会先加载父类.
  • 显式加载:
    1. 通过ClassLoader.loadClass()方法进行加载.
    2. 通过Class.forName()方法进行加载.

2.6 类加载时静态代码块一定会执行吗?

不一定,静态代码块块发生在类的"初始化"阶段,不初始化则不会执行静态代码块.

2.7 如何理解类的主动加载和被动加载?

  • 主动加载:是有目的性的,是显示加载,会执行加载,连接,初始化静态域.
  • 被动加载:是被触发的,是隐式加载,只执行加载,连接,不初始化类静态域.

2.8 为什么要自己定义类加载器,如何定义?

  • 为什么要自己定义类加载器:
  1. 隔离加载类(不同框架有相同全限定名的类).
  2. 修改类加载的方式(打破类的双亲委派模型).
  3. 扩展加载源(例如从数据库中加载类).
  4. 防止源码泄漏(对字节码文件进行加密,用时再通过自定义类加载器对其进行解密).
  • 如何定义:
  1. 继承ClassLoader.
  2. 重写findClass,在findClass里获取类的字节码,并调用ClassLoader中的defineClass方法来加载类,获取class对象.

3. 字节码增强部分

3.1 为何要学习字节码?

对于开发人员来说,了解字节码可以更准确,直观的理解java语言中更深层次的东西,比如通过字节码,可以直观地看到Volatile关键字如何在字节码上生效.另外,字节码增强技术在Spring AOP,各种ORM框架,热部署中的应用屡见不鲜,深入理解其原理对于我们来说大有裨益.除此之外,由于JVM规范的存在,只要最终可以生成符合规范的字节码就可以在JVM上运行,因此这就给了各种运行在JVM上的语言(如Scala,Groovy,Kotlin)一种契机,可以扩展Java所没有的特性或者实现各种语法.理解字节码后再学习这些语言,可以"逆流而上".从字节码视角看它的设计思路.学习起来也"易如反掌".

3.2 如何解读字节码内容?

  1. 可以通过notepad++(需要安装HEX-Editor插件)打开.class文件.
  2. jdk自带的反编译工具–javap.
  3. Idea中安装插件jclasslib.

3.3 字节码内容由哪几部分构成?

  1. magic(魔数)
  2. minor_version(次版本号)
  3. major_version(主版本号)
  4. constant_pool_count(常量池计数器)
  5. constant_pool<constant_pool_count-1>(常量池)
  6. access_flags(类的访问标志)
  7. this_class(当前类名索引值)
  8. super_class(父类名索引值)
  9. interfaces_count(接口计数)
  10. interfaces<interfaces_count>(接口数组)
  11. fields_count(成员变量计数)
  12. fields<fields_count>(成员变量数组)
  13. methods_count(方法计数)
  14. methods<methods_count>(方法数组)
  15. attributes_count(属性计数)
  16. attributes<attributes_count>(属性数组)

3.4 什么是字节码增强?

字节码增强技术相当于是一把打开运行时JVM的钥匙,利用它可以对现有字节码进行修改或者动态生成新的字节码,进而对运行中的程序做修改,实现热部署.也可以跟踪JVM运行中程序的状态,进行性能诊断等.

3.5 为什么要进行字节码增强?

掌握字节码增强后可以高效地定位并快速修复一些棘手的问题(如线上性能问题,方法出现不可控的出入参需要紧急加日志等问题),也可以在开发中减少冗余代码,大大提高开发效率.

3.6 你了解哪些字节码增强技术?

  1. ASM技术
  2. Javaassist技术
  3. Java Agent技术

3.7 什么是热替换以及如何实现?

  • 什么是热替换:
    热替换是指在程序的运行过程中,不停止服务,只通过替换程序文件来修改程序的行为.
    热替换的关键需求在于服务不能中断,修改必须立即表现正在运行的系统之中.
  • 如何实现:
    1. 创建业务service类,将此类作为字节码增强对象.
package com.java.jvm.bytecode.service;

public class CycleService {
    public void doCycle(){
       System.out.println("doCycle()");
    }
}
  1. 创建Transformer对象,用于对CycleService对象进行功能增强.
package com.java.jvm.bytecode.instrument;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;

import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;

public class DefaultClassTransformer implements ClassFileTransformer {
   
  @Override
    public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
 byte[] classfileBuffer) throws IllegalClassFormatException {
        System.out.println("Transforming " + className);
        try {
            ClassPool cp = ClassPool.getDefault();
            CtClass cc = cp.get("com.java.jvm.bytecode.service.CycleService");
            CtMethod m = cc.getDeclaredMethod("doCycle");
            m.insertBefore("{ System.out.println(\"start\"); }");
            m.insertAfter("{ System.out.println(\"end\"); }");
            byte[] bytes = cc.toBytecode();
            return bytes;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

  1. 创建Agent对象,用于调用DefaultClassTransformer对象执行字节码增强,在Agent中可定义两个方法进行不同时间点进行增强.
package com.java.jvm.bytecode.instrument;

import com.java.jvm.bytecode.service.CycleService;

import java.lang.instrument.Instrumentation;

/**
 * 定义Agent对象
 */
public class DefaultAgent {
    /**假如你希望在main方法执行之前执行,就这样定义方法*/
    public static void premain(String args, Instrumentation inst){
        System.out.println("premain->"+args);
        inst.addTransformer(new DefaultClassTransformer(),true);
    }
    /**
     * 这种方式是要以attach的方式进行载入,然后在java程序启动后执行。
     * @param args
     * @param inst
     */
    public static void agentmain(String args, Instrumentation inst){
        System.out.println("agentmain->"+args);
        inst.addTransformer(new DefaultClassTransformer(),true);
        try {
            //指明哪些类需要重新加载
            inst.retransformClasses(CycleService.class);
        }catch (Exception e){
            System.out.println("agent error");
        }
    }
}



  1. 添加maven插件用于对项目进行打包.
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>8</source>
            <target>8</target>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.2.0</version>
        <configuration>
            <archive>
                <manifest>
                    <addClasspath>true</addClasspath>
                </manifest>
                <manifestEntries>
                    <Premain-Class>com.java.jvm.bytecode.instrument.DefaultAgent</Premain-Class>
                    <Agent-Class>com.java.jvm.bytecode.instrument.DefaultAgent</Agent-Class>
                    <Can-Redefine-Classes>true</Can-Redefine-Classes>
                    <Can-Retransform-Classes>true</Can-Retransform-Classes>
                </manifestEntries>
            </archive>
        </configuration>
    </plugin>
</plugins>

  1. 创建CycleServiceTests类,对CycleService对象进行调用,也就是启动服务.
package com.java.jvm.bytecode;

import com.java.jvm.bytecode.service.CycleService;

import java.lang.management.ManagementFactory;

public class CycleServiceTests {
    public static void main(String[] args) {
        String name = ManagementFactory.getRuntimeMXBean().getName();
        String s = name.split("@")[0];
        //打印当前Pid
        System.out.println("pid:"+s);
        CycleService cs=new CycleService();
        while(true) {
            try {
                cs.doCycle();
                Thread.sleep(3000);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

  1. 添加tools依赖.
<dependency>
    <groupId>com.sun</groupId>
    <artifactId>tools</artifactId>
    <version>1.8</version>
    <scope>system</scope>
    <systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>

  1. 创建AgentInstrumentTests类.
package com.java.jvm.bytecode;

import com.sun.tools.attach.VirtualMachine;

import java.lang.management.ManagementFactory;

public class AgentInstrumentTests {
    public static void main(String[] args) throws Exception{
        //传入目标 JVM pid(这里的id为CycleServiceTests类中打印的进程id)
        VirtualMachine vm = VirtualMachine.attach("4328");
        vm.loadAgent("E:/TCGBIV/DEVCODES/CGB2112CODES/01-java/target/01-java-1.0-SNAPSHOT.jar");
    }
}

  1. 分别运行CycleServiceTests、AgentInstrumentTests类进行测试 .
    在这里插入图片描述

4. JVM运行内存部分

4.1 JVM运行内存是如何划分的?

  1. 程序计数器
  2. 虚拟机栈
  3. 本地方法栈
  4. 方法区

4.2 JVM中的程序计数器用于做什么?

CPU运行时,需要在线程间来回切换,当切换回当前线程时,为了知道从哪里开始执行,就需要一个计数器记录CPU在当前线程的执行位置.

4.3 JVM虚拟机栈的结构是怎样的?

  1. 局部变量表.
  2. 操作数栈(或表达式栈).
  3. 动态链接(或指向运行时常量池的方法引用).
  4. 方法返回地址(或方法正常退出或者异常退出的定义).
  5. 一些附加信息.

4.4 JVM虚拟机栈中局部变量表的作用是什么?

用于存放方法参数和方法内部定义的局部变量信息.

4.5 JVM虚拟机栈中操作数栈的做用时什么?

在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据.

4.6 JVM堆的构成是怎样的?

堆内存在jvm中可分为年轻代和老年代,年轻代又分为Eden和两个Survivor区.

4.7 Java对象分配内存的过程是怎样的?

  1. 编译器通过逃逸分析,确定对象是在栈上分配还是在堆上分配.
  2. 如果是在堆上分配,则首先检测是否可在TLAB(Thread Local Allocation Buffer)上直接分配.
  3. 如果TLAB上无法直接分配,则在Eden加锁区进行分配(线程共享区).
  4. 如果Eden区无法存储对象,则执行Yong GC(Minor Collection).
  5. 如果Yong GC之后Eden区仍然不足以存储对象,则直接分配在老年代.

4.8 JVM年轻代幸存区设置的比较小会有什么问题?

伊甸园区被回收时,对象要拷贝到幸存区,如果幸存区比较小,拷贝的对象比较大,对象就会直接存储到老年代,这样会增加老年代GC的频率,而分代回收的思想就会被弱化.

4.9 JVM年轻代伊甸园区设置的比例比较小会有什么问题?

伊甸园区设置的比较小会增加GC的频率,可能导致STW的时间变长,影响系统性能.

4.10 JVM堆内存为什么要分成年轻代和老年代?

为了更好的实现垃圾回收.

4.11 如何理解JVM方法区以及它的构成是怎样的?

  • 如何理解JVM方法区:
    方法区是一种规范,用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译后的代码等数据.
  • JVM方法区的构成是怎样的:
    1. 类信息包括对每个加载的类型(类,接口,枚举,注解)以及属性和方法信息.
    2. 常量信息可以看作是一张表,虚拟机指令根据这张常量表找到要执行的类名,方法名,参数类型,字面量等类型.

4.12 什么是逃逸分析以及可以解决什么问题?

逃逸分析是一种数据分析算法,基于此算法可以有效减少java对象在堆内存中的分配.

4.13 何为内存溢出以及导致内存溢出的原因?

  • 何为内存溢出
    内存中剩余的内存不足以分配给新的内存请求就会内存溢出,内存溢出可能直接导致系统崩溃.
  • 导致内存溢出的原因:
    1. 内存泄漏.
    2. 创建的对象太大导致堆内存溢出.
    3. 创建的对象太多导致堆内存溢出.
    4. 方法出现了无限递归调用导致栈内存溢出.
    5. 方法区内存空间不足导致内存溢出.

4.14 何为内存泄漏以及内存泄漏的原因是什么?

  • 何为内存泄漏:
    动态分配的内存空间,在使用完毕后未得到释放,结果导致一直占据该内存单元,直到程序结束,这个现象称之为内存泄漏.
  • 内存泄漏的原因是什么:
    1. 大量使用静态变量(静态变量与程序生命周期一样).
    2. IO/连接资源用完没关闭(用完没有close).
    3. 内部类的使用方式存在问题(实例内部类或默认引用外部类对象).
    4. 缓存应用不当(尽量不要强引用).
    5. ThreadLocal应用不当(用完没有remove).

4.15 JAVA中的四大引用你知道多少?

  1. 强引用:
    我们使用的最普遍的引用,如果一个对象具有强引用,那么当虚拟机内存不足时,虚拟机宁愿抛出OutOfMemoryError错误,也不愿随意回收强引用.
  2. 软引用:
    ​ 如果内存空间足够,就不会回收它;如果内存空间不足,就会回收这类对象的内存,只要垃圾回收期没有回收它,就可以一直被程序使用.
  3. 弱引用:
    当垃圾回收器扫描内存空间时,一旦发现只有弱引用的对象,不管当前内存空间足够与否,都会对其进行回收. 在使用过程中,其可以和引用队列(ReferenceQueue)一同使用.
  4. 虚引用:
    如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都有可能被垃圾回收器回收.虚引用主要用来跟踪对象被垃圾回收的活动.

5. JVM垃圾回收部分

5.1 何为GC以及为何要GC?

  • 何为GC:
    GC为JVM对堆内存进行垃圾回收的一个动作.
  • 为何要GC:
    程序在运行过程中会不断地产生内存碎片,如果一直不进行GC操作,那么程序迟早会因为内存耗尽而抛出OutOfMemoryError错误而终止程序.

5.2 你知道哪些GC算法?

  1. 标记清除:分为”标记”和”清除”阶段,首先会标记出内存中所有不需要回收的对象,然后从内存中清除所有未标记的对象.
    标记清除算法

  2. 标记复制:将内存分为大小相同的两块,当一块使用完了,就把当前存活的对象复制到另一块,然后一次性清空当前区域.
    标记复制算法

  3. 标记整理:结合了”标记-清除”和”复制”两个算法的优点,第一阶段从根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把存活对象”压缩”复制到堆的其中一块空间中,按顺序排放,第三阶段,清理掉存活边界以外的全部内存空间.
    标记整理算法

5.3 JVM中有哪些垃圾回收器?

  1. Serial收集器(串行收集器)
  2. Parallel收集器(并行收集器)
  3. CMS收集器(并发收集器)
  4. G1收集器

5.4 服务频繁fullgc,younggc次数较少,可能原因?

  1. 系统承载高并发请求,或者处理数据量过大,导致Young GC很贫乏,而且每次Young GC过后存活对象太多,内存分配不合理,Survivor区过小,导致对象频繁进入老年代,频繁触发Full GC.
  2. 系统一次性加载过多数据进内存,搞出来很多大对象,导致频繁有大对象进入老年代,必然频繁触发Full GC.
  3. 系统发生了内存泄漏,莫名其妙创建大量的对象,始终无法回收,一直占用在老年代里,必然频繁触发Full GC.
  4. Metaspace(永久代)因为加载类过多触发Full GC.
  5. 误调用System.gc()触发Full GC.

文章到这里就先结束了,后面还会持续更新,希望能帮助到各位大佬。如果文章有需要改进的地方还请各位大佬斧正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM面试FAQ分析 的相关文章

  • Jackson JSON + Java 泛型

    我正在尝试将以下 JSON 反序列化 映射到List
  • “源兼容性”和“目标兼容性”有什么区别?

    之间有什么关系 区别sourceCompatibility and targetCompatibility 当它们设置为不同的值时会发生什么 根据工具链和兼容性 https docs gradle org current userguide
  • java程序有多少种结束方式?

    我知道使用 System exit 0 可以结束一个java程序 例如 如果我有一个JFrame窗口 它会关闭并结束程序 但我想知道还有多少其他方法 可以关闭它并结束程序 包括发生错误时 程序会被关闭 JFrame也会被关闭吗 添加到其他答
  • 如何在 Android 应用程序中隐藏 Flutterwave API 密钥

    我正在构建一个 Android 应用程序 目前正在将 Flutterwave 集成到我的应用程序中以进行支付 建议我永远不要将 Flutterwave API 密钥放在我的应用程序上 那么我该如何隐藏这些键呢 我正在使用 Retrofit
  • 我们可以有条件地声明 spring bean 吗?

    有没有一种方法可以有条件地声明 Spring bean 例如
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • 2^31 次方的 Java 指数错误 [重复]

    这个问题在这里已经有答案了 我正在编写一个java程序来输出2的指数幂 顺便说一句 我不能使用Math pow 但是在 2 31 和 2 32 处我得到了其他东西 另外 我不打算接受负整数 My code class PrintPowers
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • 如何使用 Jersey 将嵌套列表封送为 JSON?我得到一个空数组或一个包含数组的单元素字典数组

    我正在开发一个使用 Jersey 将对象转换为 JSON 的项目 我希望能够写出嵌套列表 如下所示 data one two three a b c 我想要转换的对象首先将数据表示为 gt gt 我认为 Jersey 会做正确的事情 以上输
  • Lombok 不适用于 Eclipse Neon

    我下载了lombok jar lombok 1 16 14 jar 并将其放入我的下载中 然后我点击这个 jar 执行正确地识别了我的 MacOS 上的 Eclipse 实例 然后我选择了我想要的实例 Lombok也在pom xml中指定
  • 我们如何使用 thymeleaf 绑定对象列表的列表

    我有一个表单 用户可以在其中添加任意数量的内容表对象这也可以包含他想要的列对象 就像在 SQL 中构建表一样 我尝试了下面的代码 但没有任何效果 并且当我尝试绑定两个列表时 表单不再出现 控制器 ModelAttribute page pu
  • titledBorder 标题中的图标

    您好 是否可以在 titledBorder 的标题中放置一个图标 例如以下代码 import java awt GridLayout import javax swing JFrame import javax swing JLabel i
  • 即使禁用安全性,OAuth 令牌 API 也无法在 Elastic Search 中工作

    我是 Elastic search 新手 使用 Elastic search 版本 7 7 1 我想通过以下方式生成 OAuth 令牌弹性搜索文档 https www elastic co guide en elasticsearch re
  • 用于请求带有临时缓存的远程 Observable 的 RxJava 模式

    用例是这样的 我想暂时缓存最新发出的昂贵的Observable响应 但在它过期后 返回到昂贵的源Observable并再次缓存它 等等 一个非常基本的网络缓存场景 但我真的很难让它工作 private Observable
  • 在 Java 中通过 D-Bus MPRIS 访问 Clementine 实例

    我使用 Clementine 作为音乐播放器 它可以通过 D Bus 命令进行控制 在命令行上 使用 qdbus 我可以 Start Stop 暂停播放器 强制它跳过播放列表中的歌曲 检查播放列表的长度 检查播放列表中当前播放的曲目及其元数
  • 检测到 JVM 正在关闭

    我有一个使用 addShutdownHook 处理 Ctrl C 的 Swing 应用程序 它工作正常 直到我的关闭任务之一调用一个在正常情况下更改 JLabel 文本的函数 此时它挂起 我认为问题是 Swing EDT 已终止或正在等待某
  • 如何让 Firebase 与 Java 后端配合使用

    首先 如果这个问题过于抽象或不适合本网站 我想表示歉意 我真的不知道还能去哪里问 目前我已经在 iOS 和 Android 上开发了应用程序 他们将所有状态保存在 Firebase 中 因此所有内容都会立即保存到 Firebase 实时数据
  • Java 的“&&”与“&”运算符

    我使用的示例来自 Java Herbert Schildt 的完整参考文献 第 12 版 Java 是 14 他给出了以下 2 个示例 如果阻止 第一个是好的 第二个是错误的 因此发表评论 public class PatternMatch
  • 关闭扫描仪是否会影响性能

    我正在解决一个竞争问题 在问题中 我正在使用扫描仪获取用户输入 这是 2 个代码段 一个关闭扫描器 一个不关闭扫描器 关闭扫描仪 import java util Scanner public class JImSelection publ

随机推荐

  • docker 安装 mysql (windows版本)

    docker 安装 mysql windows版本 1 下载 MySQL 社区版映像 运行以下命令 docker pull mysql mysql server 5 7 2 启动Docker容器 请使用以下命令 docker run nam
  • 第一行代码——第五章:全局大喇叭——详解广播机制

    目录 5 1 广播机制简介 5 2 接收系统广播 5 2 1 动态注册监听网络变化 5 2 2 静态注册实现开机启动 5 3 发送自定义广播 5 3 1 发送标准广播 5 3 2 发送有序广播 5 4 使用本地广播 5 5 广播最佳实践 实
  • 一文掌握 MobileNetV3 在 TorchVision 中的实现细节

    TorchVision v0 9 中新增了一系列移动端友好的模型 可用于处理分类 目标检测 语义分割等任务 本文将深入探索这些模型的代码 分享值得注意的实现细节 解释这些模型的配置和训练原理 并解读模型优化过程中官方做出的重要权衡 本文的目
  • Linux Redis-v6.2.7的安装与配置

    Redis v6 2 7的安装与配置 官网下载页地址 1 下载 解压 编译安装 wget https download redis io releases redis 6 2 7 tar gz cp redis 6 2 7 tar gz u
  • localhost: Error: JAVA_HOME is not set. [Hadoop] Error: JAVA_HOME is not set

    localhost Error JAVA HOME is not set 在namenode启动脚本 Hadoop HOME bin start dfs sh的时候发现datanode报错 Error JAVA HOME is not se
  • 非确定性算法_近似算法

    晓强Deep Learning的读书分享会 先从这里开始 从大学开始 大家好 我是晓强 计算机科学与技术专业研究生在读 我会不定时的更新我的文章 内容可能包括深度学习入门知识 具体包括CV NLP方向的基础知识和学习的论文 网络表征学习的相
  • Pycharm无法正常安装第三方库的时候,有以下几条应对方法

    1 首先检查自己的环境变量是否配置正确 点击setting 点击 Python Interpreter 点击Add Interpreter 找到这个界面 点击右方三个点 然后选择正确的python安装位置 点击OK 配置完毕之后再试一次从这
  • android轮播图实现方案,Android轮播图实现教程

    ListView的headerView设置为轮播图之后结合上 下拉刷新 加载的模式成为现在大多数APP的一个必须具备的功能 对于许多初学者来说想要实现轮播图这样一个集线程睡眠 自动处理 替换过程中刷新UI界面的组合功能非常困难 没有思路 感
  • 实验吧 web题--代码审计类

    一 因缺思汀的绕过 1 web题常规套路就是查看源代码 于是右击查看源代码发现 br 构造url http ctf5 shiyanbar com web pcat source txt 查看php代码 2 关键php代码 if mysql
  • [HashMap源码学习之路]---put方法中的hash方法介绍

    HashMap中的put方法中的hash方法 以下是put方法的代码 public V put K key V value return putVal hash key key value false true 当我第一次看到这个地方的时候
  • 2022年,能让你月入过万的5个副业,不信试试

    2021年已经过去了 不管过去的一年 是成功还是失败 一切都过去了 新的一年要开始做新的规划 当务之急 搞钱最为重要 01 自媒体写作 以前我总是觉得会写文章不算什么技能 工作之后才发现 文字功底好优势好大 无论是工作还是做副业 发现会写文
  • 10.29奇偶交换排序

    奇偶交换排序如下所述 第一趟对所有奇数i 将a i 和a i 1 进行比较 第二趟对所有的偶数i 将a i 和a i 1 进行比较 若a i gt a i 1 则将两者交换 第三趟对奇数i 第四趟对偶数i 依次类推直至整个序列有序为止 in
  • Flask 学着用模板 render_template

    上一章节是做到了在本地浏览器上打印出hello world 如果你要更加复杂 可以像下面一样在return结果里添加内容 但是 简单的几句话你可以这么写 要是整的一个网页 你可没法把代码都拖在return后面吧 所以 后面引入了模板功能 模
  • 抽象函数(Java)

    我们现在深入理解一下抽象数据类型背后的理论 这些理论不仅本身很有趣 它们在ADT的设计与实现中也很有意义 如果你能够很好的理解它们 你将会设计出更好的抽象类型 并且远离那些隐晦的陷阱 在研究抽象类型的时候 先思考一下两个值域之间的关系 表示
  • console错误合集

    handlers i call is not a function 从报错的handlers i call 入手查找原因 这个错误是 调用相关的生命周期钩子函数引起来的错误 查看你的页面相关 生命周期钩子函数 是否有 声明了未定义方法 或是
  • 程序员的小浪漫----烟火

    多代码 慎读 预览 完整项目预览 预览地址 属性设计 烟花状态 烟花应有三个状态 升空 等待炸裂 炸裂后 烟花 发射点 x y 爆炸点 xEnd yEnd 升空后等待炸裂时间 wait 炸裂后微粒个数 count 烟花半径 radius 烟
  • 数据产品经理基础之写好报表需求文档

    今天业务部门向我提了个需求 想要在BI上实现一份日报表 并提供了一份日报表的excel文档样例 我为了 敏捷开发 没写需求文档 直接把excel扔给了开发 结果就导致一系列后遗症 首先是开发在写sql的过程频繁确认需求 xxx字段是什么意思
  • 白盒测试相关的一些知识

    在白盒测试中 可以使用各种测试方法进行测试 下面这篇文章 可能比较枯燥 如果不乐意读 可以先收藏 如果在你的工作中真遇到白盒测试的话 可以回过头再来看看 还是值得读一读 一般来说 白盒测试时要考虑以下5个问题 1 测试中尽量先用自动化工具来
  • 数据结构之链表与线性表

    数据结构之链表与线性表 线性表 顺序线性表 顺序表 顺序线性表 使用数组实现 一组地址连续的存储单元 数组大小有两种方式指定 一是静态分配 二是动态扩展 优点 随机访问特性 查找O 1 时间 存储密度高 逻辑上相邻的元素 物理上也相邻 缺点
  • JVM面试FAQ分析

    JVM面试FAQ分析 1 入门部分 1 1为什么要学习JVM 1 2 你了解哪些JVM产品 1 3 JVM的构成有哪几部分 2 类加载部分 2 1 你知道哪些类加载器 2 2 什么是双亲委派类加载模型 2 3 双亲委派方式加载类有什么优势