堆区
2021-09-14 13:26:23 0 举报
堆区
作者其他创作
大纲/内容
放置S0/S1区域
对象分配过程流程控制
Java堆区是可固定大小或者动态改变内存大小的空间。 设置堆内存起始大小:-Xms,默认情况下是物理真实内存的/64 设置堆内存最大空间:-Xmx,默认情况下是物理真实内存的/4通常将这两个参数大小设置一致,避免在执行GC垃圾回收执行重新为内存分隔计算大小,提高执行性能。
Old放得下?
to区
设置新生代和老年代在堆内存中的占比:-XX: NewRatio = 2,新生代为1,老年代为2,新生代占整个堆的1/3-XX: NewRatio = 4,新生代为1,老年代为4,新生代占整个堆的1/5 设置新生代中Eden和Survivor区的占比: 新生代中,Eden区和另外两个的Survivor区默认占比是8:1:1,可以通过参数来修改占比大小,例如:-XX: SurvivorRatio =<N>
N
对象存活超过阈值?
TLAB
Survivor1区
Y
对象分配过程
Full GC:
分配内存空间
加载
老年代
逃逸分析的基本行为就是分析对象动态作用域: 当一个对象在方法内被定义时,对象只在方法内部使用,则没有发生逃逸。 当一个对象被方法中所定义后,它被外部方法所引用,则认为发生逃逸。例如作为调用参数传递到其他地方中。 使用逃逸分析,编译器可以对代码做如下优化: 一、栈上分配。将堆分配转化为栈分配。如果一个对象在子程序中被分配,要使指向该对象的指针永远不会逃逸,对象可能是栈分配的候选,而不是堆分配。 二、同步省略。如果一个对象被发现只能从一个线程被访问到,那么对于这个对象的操作可以不考虑同步。 三、分离对象或标量替换。有的对象可能不需要作为一个连续的内存结构存在也可以被访问到,那么对象的部分(或全部)可以不存储在内存,而是存储在CPU寄存器中。
结果
对象实例化
设置堆内存参数
内 部 结 构
Minor GC:
分代思想
Minor GC 采用复制算法,复制之后有交换,谁空谁是to。
YGC
逃逸分析
分类
GC触发的策略条件
元空间
Survivor0区
方法区
Minor GC、Major GC 与 Full GC
堆区(Heap)
Eden放得下?
初始化
验证
伊甸园(Eden)
OOM
补充
准备
Eden分配
触发Full GC的五种情况: 📕 调用System.gc()方法,系统建议执行GC,但并不执行。 📕 老年代空间不足 📕 方法区空间不足 📕 通过Minor GC后进入老年代的平均内存大于老年代的平均内存 📕 由Eden区向Survivo人0区复制对象时,超出Survivor0区内存(大数据),即存入老年代且超过老年代剩余内存
new对象
Survivor放得下?
.class字节码文件
出现了Major GC,至少会伴随着一次Minor GC。Major GC比Minor GC的速度慢了10倍以上。
堆是共享区域,任何线程都可以访问到堆中的共享数据。由于对象创建在JVM中非常频繁,因此在并发环境下在堆中划分内存空间是不安全的。必须提供加锁机制,而这又影响了分配速度。因此,在Eden空间中,对每个线程划分了一块私有缓存区域,多线程在分配内存的同时,还能避免线程不安全的问题,提高吞吐量,因此我们把这种内存分配策略称为快速分配策略。
现在的JVM都是基于分代理论进行垃圾收集的,主要分为部分垃圾回收和整堆垃圾回收两个部分。 Minor GC 是针对于新生代的垃圾回收。 Major GC是针对于老年代的垃圾回收。 Full GC是针对于整个java堆和方法区的垃圾回收。
1. new出来的对象会首先存在Eden区。 2. 当Eden区填满时,程序又需要创建新的对象,就会触发Minor GC,将Eden区中不再被引用的对象销毁,再加载的对象存入伊甸园区。 3. 然后将Eden区中的对象存入到Survivor0区(首次) 4. 如果再次触发垃圾回收,会将上次Survivor0区的对象复制到Survivor1区,同时将伊甸园区的没有被回收的对象复制到Survivor1区(即上图) 5. 当再次触发垃圾回收机制,会再次从Survivor1区复制到Survivor0区,往此反复15次后,将存活对象存入老年代。 6. 当老年代中的内存空间不足时,就会触发Major GC,如果清理后依然不足就会产生OOM异常。
检查是否加载
伊甸园区(Eden)
为什么要堆空间分代? 因为不同的Java对象生命周期不同,如果不进行分代的话,执行GC垃圾回收需要扫描所有的对象,会影响执行效率。
将reference入栈
FGC
解析
Eden区
概述
新生代
Thresold
生命周期
TLAB空间分配
堆 区
存储在JVM中的对象可以被分为两类: 一种是生命周期较短的对象,朝生夕死,创建和消亡都非常频繁; 一种是生命周期比较长的对象,极端情况下甚至能与JVM的生命周期保持一致。 Java堆区进一步细分,可以划分为新生代和老年代,其中新生代又分为Eden区和Survivor0区和Survivor1区
Major GC:
虚拟机栈是Java程序运行时的单元,而堆区则是存储的单元。一个JVM只有一个堆区,而且堆区在内存上是多块不连续的内存空间,在逻辑上被认为是连续存在的。且在堆区中设有私有缓存区域来保证对象创建的安全性。当方法结束后,内存中的对象不会被立即移除,而是需要等到GC垃圾回收器回收。并且所有的线程共享一个Java堆区。
from区
当新生代空间不足时,就会触发Minor GC垃圾回收,这里指的新生代满是Eden区,Survivor区满并不会引起Minor GC。
在JVM启动的时候即被创建,随着JVM的销毁而销毁
更新PC寄存器
0 条评论
回复 删除
下一页