堆内存
-
一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的核心区域.
-
Java 堆区在 JVM 启动时的时候即被创建,其空间大小也就确定了,是 JVM 管理的最大一块内存空间.
-
堆内存的大小是可以调节.
例如: -Xms:10m(堆起始大小) -Xmx:30m(堆最大内存大小)
一般情况可以将起始值和最大值设置为一致,这样会减少垃圾回收之后堆内存重新分配大小的次数,提高效率.
-
《Java 虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但逻辑上它应该被视为连续的.
-
所有的线程共享 Java 堆,在这里还可以划分线程私有的缓冲区.
-
《Java 虚拟机规范》中对 Java 堆的描述是:所有的对象实例都应当在运行时分配在对上.
-
在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除.
-
堆,是 GC(Garbage Collection,垃圾收集器)执行垃圾回收的重点区域
堆内存区域划分
Java8 及之后堆内存分为:新生区(新生代)+老年区(老年代)
新生区分为 Eden(伊甸园)区和 Survivor(幸存者)区
为什么分区(代)?
将对象根据存活概率进行分类,对存活时间长的对象,放到固定区,从而减少扫
描垃圾时间及 GC 频率。针对分类进行不同的垃圾回收算法,对算法扬长避短。
-
Eden区中的对象如果被其他对象引用了,将会分配到Survivor0中(from),相对的如果其中的对象没有被其他引用那么其对象就会被垃圾回收
-
Eden区中的对象如果被其他对象引用了,将会分配到Survivor1(from)中,相对的如果其中的对象没有被其他引用那么其对象就会被垃圾回收,Survivor0(to)中的对象分配到Survivor1中。
- Eden区中的对象如果被其他对象引用了,将会分配到Survivor0(from)中,相对的如果其中的对象没有被其他引用那么其对象就会被垃圾回收。Survivor1(to)中的对象分配到Survivor0中。如果阙值足够大,那么相对应的对象会被调用到Old(老年)区。
注意:绿色表示被调用的方法,红色表示没被调用的方法,数字表示被调用的次数
堆空间的参数设置
-XX:+PrintFlagsInitial 查看所有参数的默认初始值
-XX:+PrintFlagsFinal 查看所有参数的最终值(修改后的值)
-Xms:初始堆空间内存(默认为物理内存的 1/64)
-Xmx:最大堆空间内存(默认为物理内存的 1/4)
-Xmn:设置新生代的大小(初始值及最大值)
-XX:NewRatio:配置新生代与老年代在堆结构的占比
-XX:SurvivorRatio:设置新生代中 Eden 和 S0/S1 空间比例
-XX:MaxTenuringTreshold:设置新生代垃圾的最大年龄
-XX:+PrintGCDetails 输出详细的 GC 处理日志
字符串常量池
字符串常量池为什么要调整位置?
JDK7 中将字符串常量池放到了堆空间中。因为永久代的回收效率很低,在 Full GC 的时候才会执行永久代的垃圾
回收,而 Full GC 是老年代的空间不足、永久代不足时才会触发。这就导致 StringTable 回收效率不高,而我们开
发中会有大量的字符串被创建,回收效率低,导致永久代内存不足。放到堆里,能及时回收内存。
注:永久区----方法区
TLAB机制
为什么有 TLAB(Thread Local Allocation Buffer)
堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据. 由于对象实例的创建在JVM中非常频繁,因此在并环
境下从堆区中划分内存空间是线程不安全的. 为避免多个线程操作同一地址,需要使用加锁等机制,进而影响分配度
什么是 TLAB?
TLAB 的全称是 Thread Local Allocation Buffer,即线程本地分配缓存区,这是一个线程专用的内存分配区域。
如果设置了虚拟机参数 -XX:UseTLAB,在线程初始化时,同时也会申请一块指定大小的内存,只给当前线程用这
样每个线程都单独拥有一个空间,如果需要分配内存,就在自己的空间上分配,这样就不存在竞争的情况,可以大
大提升分配效率。JVM 使用 TLAB 来避免多线程冲突,在给对象分配内存时,每个线程使用自己的 TLAB,这样可
以避免线程同步,提高了对象分配的效率。TLAB 空间的内存非常小,缺省情况下仅占有整个 Eden 空间的 1%,
也可以通过选项-XX:TLABWasteTargetPercent 设置 TLAB 空间所占用 Eden 空间的百分比大小。
B 空间的内存非常小,缺省情况下仅占有整个 Eden 空间的 1%,
也可以通过选项-XX:TLABWasteTargetPercent 设置 TLAB 空间所占用 Eden 空间的百分比大小。