堆内存

堆内存

  • 一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的核心区域.

  • Java 堆区在 JVM 启动时的时候即被创建,其空间大小也就确定了,是 JVM 管理的最大一块内存空间.

  • 堆内存的大小是可以调节.

    例如: -Xms:10m(堆起始大小) -Xmx:30m(堆最大内存大小)

    一般情况可以将起始值和最大值设置为一致,这样会减少垃圾回收之后堆内存重新分配大小的次数,提高效率.

  • 《Java 虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但逻辑上它应该被视为连续的.

  • 所有的线程共享 Java 堆,在这里还可以划分线程私有的缓冲区.

  • 《Java 虚拟机规范》中对 Java 堆的描述是:所有的对象实例都应当在运行时分配在对上.

  • 在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除.

  • 堆,是 GC(Garbage Collection,垃圾收集器)执行垃圾回收的重点区域

堆内存区域划分

Java8 及之后堆内存分为:新生区(新生代)+老年区(老年代)

新生区分为 Eden(伊甸园)区和 Survivor(幸存者)区

为什么分区(代)?

将对象根据存活概率进行分类,对存活时间长的对象,放到固定区,从而减少扫
描垃圾时间及 GC 频率。针对分类进行不同的垃圾回收算法,对算法扬长避短。

  1. Eden区中的对象如果被其他对象引用了,将会分配到Survivor0中(from),相对的如果其中的对象没有被其他引用那么其对象就会被垃圾回收
    在这里插入图片描述

  2. Eden区中的对象如果被其他对象引用了,将会分配到Survivor1(from)中,相对的如果其中的对象没有被其他引用那么其对象就会被垃圾回收,Survivor0(to)中的对象分配到Survivor1中。

在这里插入图片描述

  1. 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 空间的百分比大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值