JVM问题合集

  1. JVM垃圾处理方法(标记清除、复制、标记整理)?
    【深入Java虚拟机】之五:Java垃圾收集机制:
    https://blog.csdn.net/qq_32534441/article/details/86098255

    1.1GC用的引用可达性分析算法中,哪些对象可作为GC Roots对象?
    • Java虚拟机栈中的对象
    • 方法区中的静态成员
    • 方法区中的常量引用对象
    • 本地方法区中的JNI(Native方法)引用对象

    1.2什么时候进行MinGC,FullGC
    • MinGC
    ○ 新生代中的垃圾收集动作,采用的是复制算法
    ○ 对于较大的对象,在Minor GC的时候可以直接进入老年代
    • FullGC
    ○ Full GC是发生在老年代的垃圾收集动作,采用的是标记-清除/整理算法。
    ○ 由于老年代的对象几乎都是在Survivor区熬过来的,不会那么容易死掉。因此Full GC发生的次数不会有Minor GC那么
    频繁,并且Time(Full GC)>Time(Minor GC)
    https://blog.csdn.net/calledWWW/article/details/79381959

  2. 各个垃圾收集器是怎么工作的?
    【深入Java虚拟机】之六:GC收集器以及JDK7,JDK8中JVM内存变化:
    https://blog.csdn.net/qq_32534441/article/details/86098487

  3. JVM如何GC,新生代,老年代,持久代,都存储哪些东西,以及各个区的作用?
    【深入Java虚拟机】之内存区域详解(Eden Space、Survivor Space、Old Gen、Code Cache和Perm Gen):
    https://blog.csdn.net/qq_32534441/article/details/86307997

  4. Java虚拟机内存的划分,每个区域的功能?及对象实例化分析
    • 程序计数器(线程私有)
    ○ 线程创建时创建,执行本地方法时其值为undefined。
    • 虚拟机栈(线程私有)
    ○ (栈内存)为虚拟机执行java方法服务:方法被调用时创建栈帧–>局部变量表->局部变量、对象引用
    ○ 如果线程请求的栈深度超出了虚拟机所允许的深度,就会出现StackOverFlowError。-Xss规定了栈的最大空间
    ○ 虚拟机栈可以动态扩展,如果扩展到无法申请到足够的内存,会出现OOM
    • 本地方法栈(线程私有)
    ○ java虚拟机栈是为虚拟机执行java方法服务的,而本地方法栈则为虚拟机执使用到的Native方法服务。
    ○ Java虚拟机没有对本地方法栈的使用和数据结构做强制规定。Sun HotSpot把Java虚拟机栈和本地方法栈合二为一
    ○ 会抛出StackOverFlowError和OutOfMemoryError
    • Java堆
    ○ 被所有线程共享,在Java虚拟机启动时创建,几乎所有的对象实例都存放到堆中
    ○ GC的管理的主要区域
    ○ 物理不连续,逻辑上连续,并可以动态扩展,无法扩展时抛出OutOfMemoryError
    • 方法区
    ○ 用于存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码的数据
    ○ Sun HotSpot 虚拟机把方法区叫做永久待(Permanent Generation)
    • 运行时常量池
    ○ 受到方法区的限制,抛出OutOfMemoryError
    【深入Java虚拟机】之一:Java内存区域与内存溢出:
    https://blog.csdn.net/qq_32534441/article/details/86097556
    形象例子:https://www.cnblogs.com/whgk/p/6138522.html

  5. JVM如何加载一个类的过程,双亲委派模型中有哪些方法有没有可能父类加载器和子类加载器,加载同一个类?如果加载同一个类,该使用哪一个类?
    5.1初始化阶段,用户定义的Java代码才真正开始执行,jvm会根据语句的执行顺序对类对象初始化,下面几种情况会触发初始化?

    • jvm遇到new、getstatic、putstatic、invokestatic这4条字节码指令,如果类没有初始化过,就会先初始化,生成这几条指令一般是如下场景: - new:使用new关键字实例化对象

      • getstatic/putstatic:读取或设置一个类的静态字段(被final修饰、已在编译器把结果放入常量池的静态字段除外)
      • invokestatic调用一个类的静态方法
    • 使用java.lang.reflect对类进行反射调用的时候,如果类没初始化要先初始化

    • 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化
    • 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。
    5.2 对于静态字段只有直接定义这个字段的类才会被初始化,而不会触发子类的初始化(执行类初始化方法)
    • 类变量:被static修饰的变量
    • 类成员变量:除了类变量的其他变量

    5.3 类初始化方法:顾名思义,类初始化方法会在类初始化的时候执行,IDE会按顺序手机变量的赋值语句,静态代码块,组合成 类初始化方法
    5.3 对象初始化方法:在对象实例化的时候才会执行,IDE会按顺序手机成员变量的赋值语句,普通代码块,最后收集构造函数代码组成对象初始化方法
    【深入Java虚拟机】之三:类加载机制:
    https://blog.csdn.net/qq_32534441/article/details/86097902
    【深入Java虚拟机】之四:类初始化
    https://blog.csdn.net/qq_32534441/article/details/86097975
    【深入Java虚拟机】之九:类加载及执行子系统的案例与实战:
    https://blog.csdn.net/qq_32534441/article/details/86165628
    一道面试题搞懂JVM类加载机制:
    https://blog.csdn.net/qq_32534441/article/details/85983501
    类加载机制&面试题分析:
    https://blog.csdn.net/x1032019725/article/details/81301614

  6. JVM 方法调用之动态分派:
    https://blog.csdn.net/qq_32534441/article/details/88593595
    Java方法调用——解析与分派:
    https://blog.csdn.net/qq_32534441/article/details/88592912

  7. 用什么工具可以查出内存泄漏
    • MemoryAnalyzer:一个功能丰富的 JAVA 堆转储文件分析工具,可以帮助你发现内存漏洞和减少内存消耗
    • EclipseMAT:是一款开源的JAVA内存分析软件,查找内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于
    Eclipse RCP(Rich Client Platform),可以下载RCP的独立版本或者Eclipse的插件
    • JProbe:分析Java的内存泄漏。

  8. JVM的线程状态及如何排查死锁原因
    http://blog.csdn.net/u014484649/article/details/27338819
    VisualVM排查JAVA应用程序线程死锁
    http://blog.csdn.net/chwshuang/article/details/44203537
    使用 VisualVM 进行性能分析及调优
    https://www.ibm.com/developerworks/cn/java/j-lo-visualvm/

  9. 用什么工具调试程序?JConsole,用过吗?
    JVM调优之JConsole和JVisualVM工具使用:
    https://blog.csdn.net/qq_32534441/article/details/88057114

  10. 了解过JVM调优没,基本思路是什么?
    JVM调优基本思路 http://www.importnew.com/22336.html
    JVM调优工具 http://www.importnew.com/23786.html

  11. 【深入Java虚拟机】之精华总结(面试)
    https://blog.csdn.net/qq_32534441/article/details/86176841

猜你喜欢

转载自blog.csdn.net/qq_32534441/article/details/89576903