其他资料
目录
1.为什么 Java 新生代被划分为 S0、S1和 Eden 区?
2.Java 中的 young Gc、old Gc、full Gc 和 mixed Gc 的区别是什么?
1.为什么 Java 新生代被划分为 S0、S1和 Eden 区?
因为新生代中的对象生命周期短,所以十分适合复制算法,按正常思路将新生代一分为二,每次只使用其中一个,然后把GC后存活的对象移动至另一块,然后把老区域的非存活对象清理掉,就能避免碎片空间的产生。
但是一分为二的话空间利用率就只有50%了,为了提高空间利用率,定义了三个区域,Eden 区和两个 Survvor 区,Eden 区+1个Survivor 区可以比二分之一大,提升利用率,默认 Eden 占 80%-个Survivor 占10%。
然后利用两个 Survivor 来交替接收 gc 后存活的对象:
比如当前用 Eden + s0 两块区域,gc 的时候将存活的对象拷贝至 s1,然后清理 Eden 和 s0,接着使用 Eden +s1 作为新的对象分配区域,以此类推。
2.Java 中的 young Gc、old Gc、full Gc 和 mixed Gc 的区别是什么?
1. Young GC(Minor GC):
当新生代内存存满之后就会触发Young GC,频率高,回收时间短
2. Old GC(Major GC):
只针对老年代。
当老年代的内存使用达到一定阈值时,会触发Old GC。Old GC的目的是回收老年代中不再使用的对象,以释放内存空间。Old GC发生的频率相对较低,因为它涉及更全面的内存回收,且可能伴随着更长时间的停顿。
3. Full GC:
Full GC涉及整个堆的垃圾回收。
Full GC通常在系统内存紧张,或者老年代空间不足,以及通过某些Java管理命令显式触发时发生。 Full GC的停顿时间通常比Young GC和Old GC要长,因为它需要清理整个堆的内存,这可能导致应用程序的性能问题。
4. Mixed GC:
Mixed GC是一种特殊类型的GC,它介于Young GC和Full GC之间,主要针对的是新生代和部分老年代(通常是老年代的一部分区域)。
Mixed GC的目的是在不清理整个堆的情况下,减少老年代的内存使用,同时回收新生代的垃圾。在某些GC实现中,Mixed GC可以作为一种优化手段,以减少Full GC的发生频率和影响。
3.什么条件会触发java中的young GC?
Eden去空间不足、E扥去+Survive区都被装满、部分垃圾回收器在full GC之前。
4.什么条件会触发java中的full GC?
1.老年代满了:老年代空间不够用了。
2.元空间满了:元空间或永久代空间不够用了。
3.调用System.gc():程序要求进行垃圾回收。
4.晋升失败:新生代的对象要移动到老年代,但老年代空间不够
5.分配担保失败:估计新生代要移动的对象会超过老年代剩余空间。
5.JVM 垃圾回收调优的主要目标是什么?
主要从低延迟和高吞吐两个方面去调优,但是往往这两者不可兼得,所以在对GC调优要具体问题具体分析,在批处理作业情况下,可能更注重吞吐量,而在实时系统中,就更注重于低延迟。
6.如何对java的垃圾回收进行调优?
核心思路就是尽量让对象在新生代就回收了,减少对象进入老年代。
但是具体情况还是要根据GC日志去分析,比如发现频繁地Full GC,分析GC日志之后没有内存泄漏,只是Young GC之后有大量对象进入老年代,最终触发Full GC,那就把Survive空间调大就好了。
延伸→怎么看GC日志?
在启动Java应用程序时,可以通过设置JVM参数来启用GC日志记录。以下是一些常用的参数:
-XX:+PrintGC
:打印GC日志。-XX:+PrintGCDetails
:打印GC的详细日志。
以上的jvm内容就结束了,下一篇开始就是mysql的面试题。