-
JVM垃圾处理方法(标记清除、复制、标记整理)?
【深入Java虚拟机】之五:Java垃圾收集机制:
https://blog.csdn.net/qq_32534441/article/details/860982551.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 -
各个垃圾收集器是怎么工作的?
【深入Java虚拟机】之六:GC收集器以及JDK7,JDK8中JVM内存变化:
https://blog.csdn.net/qq_32534441/article/details/86098487 -
JVM如何GC,新生代,老年代,持久代,都存储哪些东西,以及各个区的作用?
【深入Java虚拟机】之内存区域详解(Eden Space、Survivor Space、Old Gen、Code Cache和Perm Gen):
https://blog.csdn.net/qq_32534441/article/details/86307997 -
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 -
JVM如何加载一个类的过程,双亲委派模型中有哪些方法有没有可能父类加载器和子类加载器,加载同一个类?如果加载同一个类,该使用哪一个类?
5.1初始化阶段,用户定义的Java代码才真正开始执行,jvm会根据语句的执行顺序对类对象初始化,下面几种情况会触发初始化?jvm遇到new、getstatic、putstatic、invokestatic这4条字节码指令,如果类没有初始化过,就会先初始化,生成这几条指令一般是如下场景: - new:使用new关键字实例化对象
- getstatic/putstatic:读取或设置一个类的静态字段(被final修饰、已在编译器把结果放入常量池的静态字段除外)
- invokestatic调用一个类的静态方法
使用java.lang.reflect对类进行反射调用的时候,如果类没初始化要先初始化
- 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化
- 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。
- 类变量:被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 -
JVM 方法调用之动态分派:
https://blog.csdn.net/qq_32534441/article/details/88593595
Java方法调用——解析与分派:
https://blog.csdn.net/qq_32534441/article/details/88592912扫描二维码关注公众号,回复: 6041190 查看本文章 -
用什么工具可以查出内存泄漏
• MemoryAnalyzer:一个功能丰富的 JAVA 堆转储文件分析工具,可以帮助你发现内存漏洞和减少内存消耗
• EclipseMAT:是一款开源的JAVA内存分析软件,查找内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于
Eclipse RCP(Rich Client Platform),可以下载RCP的独立版本或者Eclipse的插件
• JProbe:分析Java的内存泄漏。 -
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/ -
用什么工具调试程序?JConsole,用过吗?
JVM调优之JConsole和JVisualVM工具使用:
https://blog.csdn.net/qq_32534441/article/details/88057114 -
了解过JVM调优没,基本思路是什么?
JVM调优基本思路 http://www.importnew.com/22336.html
JVM调优工具 http://www.importnew.com/23786.html -
【深入Java虚拟机】之精华总结(面试)
https://blog.csdn.net/qq_32534441/article/details/86176841
JVM问题合集
猜你喜欢
转载自blog.csdn.net/qq_32534441/article/details/89576903
今日推荐
周排行