JVM的区域模型
堆
这是 JVM 中最大的占用空间,里面存储了对象的实例和数组,当空间不足且无法扩展时会引起OutOfMemoryError异常。
方法区
方法区和堆线程共享,这里主要存储了已经加载的类信息、常量、静态变量和已经编译后的代码,当空间不足且无法扩展时会引起 OutOfMemoryError 异常。
虚拟机栈
每一个方法执行的时候都会创建一个栈帧,记录一个栈帧从虚拟机栈中入栈到出栈的过程,栈帧里主要记录了局部变量表、动态链接、操作数栈、方法出口信息等。
本地方法栈
其作用和虚拟机栈一样,区别是本地方法栈记录的是 Native 修饰的方法。
程序计数器
主要作用是字节码解释器获取下一个需要执行的字节码指令,通常用于线程唤醒、循环、异常处、跳出等。
JVM的垃圾回收
JVM 根据对象的存活周期进行分类,把堆内存分为新生代、老年代和永久代,是因为堆内存存放了对象的实例,是 JVM 中内存占用最大的一块,也是回收最频繁的一块,分代的原因是为了提高对象分配和垃圾回收的效率。
Full GC
Full GC 指的是垃圾回收器对整个堆进行垃圾回收的操作。Full GC 的执行时间通常比 Minor GC(对新生代进行的垃圾回收操作) 长,因为它需要遍历整个堆来查找不再使用的对象。在执行 Full GC 时,程序的执行会暂停,直到垃圾回收完成。因此,在 Java 程序中,应该尽量避免频繁触发 Full GC,以提高程序的性能。为了避免频繁触发 Full GC,可以采取一些措施,例如优化对象的创建和使用,减少对象的生命周期,使用合适的垃圾回收算法等。
触发Full GC的情况
- 老年代空间不足:当老年代空间不足时,会触发Full GC;
- 新生代空间不足,当新生代空间不足时,会触发Minor GC,如果Minor GC之后,空间依然不足,垃圾回收器会将一些对象存放到老年代,如果老年代空间不足,就会触发Full GC;
- 大对象直接存入老年代:如果大对象无法存入新生代,会直接存放到老年代,如果老年代空间不足,就会触发GC;
- 元空间不足:当元空间不足以容纳新创建的类元数据时,就会触发Full GC;
- 手动触发:通过调用
System.gc()进行触发,但不会立即触发,取决于垃圾回收器的实现和当前内存状况;
如何避免Full GC
- 避免大对象的创建:可以考虑将大对象拆分为多个小对象进行创建;
- 优化内存使用:尽量减少内存的使用,避免创建大量临时对象,可以使用对象池、字符串常量池;
- 调整新生代和老年代的大小:根据程序的内存需求,调整合理的空间大小;
- 使用合适的垃圾回收算法:根据程序的性能需求,调整合理的垃圾回收算法;
- 避免使用全局变量:尽量避免使用全局变量,因为会导致内存泄露和性能问题;
- 定期垃圾回收:通过调用
System.gc(),定期进行垃圾回收;
垃圾回收的算法
标记-清除算法
首先标记出所有存活的对象,然后清除所有未被标记的对象。这种算法简单高效,但是会产生内存碎片,可能导致内存空间的浪费。
标记-整理算法
标记-整理算法是在标记-清除算法的基础上进行改进的。首先标记出所有存活的对象,然后将存活的对象移动到内存空间的一端,然后清除另一端的所有对象。这种算法不会产生内存碎片,但是需要移动对象,可能会导致性能下降。
复制算法
复制算法是将内存空间分为两个区域,一个是活动区域,另一个是空闲区域。垃圾回收时,将存活的对象复制到空闲区域,然后一次性清除活动区域中的所有对象。这种算法不会产生内存碎片,但是需要额外的内存空间来存储复制的对象。
引用计数算法
每个对象都有一个引用计数器,当一个对象被引用时,它的引用计数器加 1;当一个对象不再被引用时,它的引用计数器减 1。当一个对象的引用计数器为 0 时,它就被认为是垃圾,可以被回收。这种算法简单高效,但是无法解决循环引用的问题。
分代垃圾回收算法
分代收集算法是根据对象的生命周期将内存空间分为不同的代,例如新生代和老年代。垃圾回收时,对不同的代采用不同的回收算法。新生代通常采用复制算法,老年代通常采用标记-清除或标记-整理算法。
垃圾优先回收算法
在进行垃圾回收时,会优先回收垃圾最多的区域,从而减少垃圾回收过程中的停顿时间。 垃圾回收器会根据每个区域的垃圾数量和存活对象的数量来计算每个区域的垃圾回收优先级,并按照优先级进行垃圾回收。
垃圾回收器
- 串行垃圾回收器:自 JDK 1.1 开始就一直存在,它使用单线程进行垃圾回收;
- 并行垃圾回收器:从 JDK 1.4 开始提供,它可以同时使用多个线程进行垃圾回收;
- CMS:从 JDK 1.5 开始提供,它可以在应用程序运行时进行垃圾回收,采用标记-清除算法,缺点是严重依赖多线程、无法清除浮动垃圾、会产生大量空间碎片;
- G1:从 JDK 1.7 开始提供,它可以在应用程序运行时进行垃圾回收,采用分代垃圾回收算法、标记-整理算法、垃圾回收优先算法;