运行时数据区:

  Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。

  根据《java虚拟机规范》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区。

        

    

                  

Java堆(Java Heap):
  是虚拟机所管理的内存中最大的一块,是所有线程共享的一块内存区域(线程不安全,OOM),在虚拟机启动时创建。
  唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。
  Java堆是垃圾收集器管理的内存区域,因此一些资料中也称为"GC堆"(Garbage Collected Heap)。
  由于现代垃圾收集器大部分都是采用分代收集理论设计,所以 Java 堆可以细分为:新生代(Young Generation)与老年代(Old Generation),新生代包括:Eden空间、From Survivor、To Survivor 空间等
  堆细分目的是更好地回收内存,或者更快地分配内存。

                                   --------------摘自《深入理解Java虚拟机—JVM高级特性与最佳实践(第三版)》

 

Java堆内存默认情况下,新生代占1/3 ,老年代占2/3。 新生代又把  Eden空间 8/10 、From Survivor 1/10、To Survivor  1/10 

 

几个关键词:minorGC、majorGC、fullGC 

Minor GC 主要在 年轻代(Young Generation)。

  当 Eden 区的空间被填满时,会触发 Minor GC。Survivor 区的满并不会直接触发 Minor GC。

Major GC 主要发生在老年代(Old Generation)。

  当老年代的空间不足时,会触发 Major GC。此外,如果 Minor GC 后,从年轻代晋升到老年代的对象导致老年代空间不足,也会触发 Major GC。

Full GC 清理整个堆内存(Heap),包括年轻代、老年代以及永久代(Permanent Generation,已被 Metaspace 替换)或元空间(Metaspace)。

  调用 System.gc() 方法时,JVM 会建议执行 Full GC,但不一定执行;当老年代空间不足时,如果没有足够的空间来存放 Minor GC 后晋升的对象时;通过 Minor GC 后进入老年代的平均对象大小大于老年代的可用内存时;当方法区(Method Area)或 Metaspace 元空间不足时;

 

关于年轻代内部 minor GC后的变化(动态年龄对象判断):

  Eden 区的空间被填满时 会触发 minor GC , 存活的对象将进入 survivor区域。

  每触发一次 minorGC ,survivor区 存活的对象将进行 from survivor,to survivor ( 这两个 Survivor 区域按照顺序被命名为 from 和 to)两个区域的交替存储并使对象的存活年龄+1。

  默认年龄最大为15 (对象内存布局中Mark Word用4个bit 存储对象分代年龄,4个bit最大 存储 15

  当它的年龄增加到一定程度 (也就是15次 minorGC都没被处理)  就会被晋升到老年代中。对象晋升到老年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold 来设置。

  动态年龄对象判断多个对象所占空间超过survivor区50% ,某个年龄段以上的对象将被移入老年代。(一般情况都是没有触发15这个阈值)

    按年龄从小到大进行累积, 当累积到某个年龄,空间大小超过survivor的50%,取 这个年龄与 MaxTenuringThreshold 中最小一个值作为阈值,大于等于这个值的对象,移入老年代

===============================================================================================================================================================================================================

 OOM:(OutOfMemoryError)

 

4bit最大能存储的值为15‌。

4bit存储范围解析

  • ‌二进制表示‌:4位二进制数可以表示从0000到1111的所有组合。
  • ‌十进制转换‌:将这些二进制数转换为十进制,范围即为0(0000)到15(1111)。
  • ‌最大值确定‌:因此,4bit能够存储的最大十进制数值是15。

这个结论直接基于二进制到十进制的转换规则,以及二进制数的位数决定了其能表示的最大值。

 

posted on 2024-10-12 17:20  zy平平仄仄  阅读(5)  评论(0编辑  收藏  举报