一 堆空间都是共享的么?
不一定,因为还有 TLAB 这个概念,在堆中划分出一块区域,为每个线程所独占。二 为什么有TLAB?
TLAB:Thread Local Allocation Buffer,也就是为每个线程单独分配了一个缓冲区。 堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据。 由于对象实例的创建在 JVM 中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的。 为避免多个线程操作同一地址,需要使用加锁等机制,进而影响分配速度。三 什么是TLAB
从内存模型而不是垃圾收集的角度看,对 Eden 区域继续进行划分,JVM 为每个线程分配了一个私有缓存区域,它包含在 Eden 空间内。 多线程同时分配内存时,使用 TLAB 可以避免一系列的非线程安全问题,同时还能够提升内存分配的吞吐量,因此我们可以将这种内存分配方式称之为快速分配策略。 所有 OpenJDK 衍生出来的 JVM 都提供了 TLAB 的设计。四 TLAB分配过程
对象首先是通过 TLAB 开辟空间,如果不能放入,那么需要通过 Eden 来进行分配。五 实战
1 代码——测试 UseTLAB 参数的开启情况/**
* 测试 -XX:UseTLAB 参数是否开启
* 默认情况是开启的
*/
public class TLABArgsTest {
public static void main(String[] args) {
System.out.println("我只是来打个酱油~");
try {
Thread.sleep(1000000);
} catch (InterruptedException e) {
e.printstacktrace();
}
}
}
2 测试
E:\javatest1\src\main\java\jvm>jps 14160 TLABArgsTest 9600 Jps 10808 RemoteMavenServer36 4040 Launcher 11500 14860 KotlinCompileDaemon E:\javatest1\src\main\java\jvm>jinfo -flag UseTLAB 14160 -XX:+UseTLAB3 说明 -XX:UseTLAB 参数默认是开启的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。