JVM总结

1. 如何判断对象可以回收?
A.引用计数算法
优点:实现简单,判定效率高
缺点:很难解决对象之间的相互循环引用的问题
B.根搜索算法
在 Java 语言中,可以作为 GC Roots 的对象包括下面几种:
虚拟机栈(栈帧中的本地变量表)中的引用的对象
方法区中的类静态属性引用的对象
方法区中的常量引用的休息
本地方法栈中JNI(即一般说的Native方法)的引用的对象

2. 强引用 > 软引用 > 弱引用 > 虚引用

3. 在新生代中,常规营业进行一次垃圾收集一般可以回收70%~95%的空间,而永久代的垃圾收集效率远低于此。
永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类。

类需要同时满足下面3个条件才能算是“无用的类”:
该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。
加载该类的 ClassLoader 已经被回收
该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法

4. 垃圾收集算法
4.1 标记-清除算法
首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象
缺点:一个是效率问题,标记和清除过程的效率都不高
另一个是空间问题,标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
4.2 复制算法
将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块内存用完后,就将还存活的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
优点:实现简单,运行高效
缺点:将内存缩小为原来的一半,浪费空间

IBM的专门研究表明,新生代中的对象98%是朝生夕死的。
HotSpot虚拟机默认Eden和Survivor的大小比例是8:1

4.3 标记-整理算法
标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
4.4 分代收集算法

5. 垃圾收集器

6. 内存分配与回收策略
大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够的空间进行分配时,虚拟机将发起一次 Minor GC。
-XX:+PrintGCDetails 打印GC日志
-XX:SurvivorRatio=8 新生代中Eden区与Survivor区的空间比例是8:1

7. Minor GC 和Full GC 的区别
新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多数都具备朝生夕灭的特性,所有 Minor GC 非常频繁,一般回收速度也比较快。
老年代GC(Majior GC / Full GC):指发生在老年代的GC,Full GC 的速度一般会比 Minor GC 慢10倍以上。

8. 大对象直接进入老年代
-XX:PretenureSizeThreshold 大于这个设置值的对象直接在老年代中分配,这样做的目的是避免在 Eden 区以及两个 Survivor 区之间发生大量的内存拷贝。

9. 长期存活的对象将进入老年代
当对象的年龄增加到一定程度(默认为15岁)时,就会被晋升到老年代中。
对象晋升老年代的年龄阈值,可以通过参数-XX:MaxTenuringThreshod来设置。

如果在 Survivor 空间中相同年龄所有对象大小的总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就会直接进入老年代,无需等待 MaxTenuringThreshod 中要求的年龄。

当发生 Minor GC 时,虚拟机会检测之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小,如果大于,则改为直接进行一次 Full GC。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值