JVM内存结构--堆

JVM内存结构

JVM内存结构指的是JVM运行时数据区结构,它主要包含以下几个部分:

  • 堆(Heap):线程共享。

  • 方法区(Method Area):线程共享。

  • 虚拟机栈(VM Stack):线程私有。

  • 程序计数器(Program Counter Register):线程私有。

  • 本地方法栈(Native Method Stack):线程私有。

堆(Heap)

JVM堆(Heap)是Java虚拟机中的一块内存区域(所有线程共享),主要用于存储对象实例和数组。堆被划分为三个部分:年轻代、老年代和永久代(在JDK8中取消了永久代),其中,年轻代又被划分为Eden区Survivor区(含:S0和S1)。

默认情况下,年轻代和老年代的比例为1:2,即:年轻代占整个堆空间的1/3,老年代占整个堆空间的2/3。Eden区与Survivor区的比例为8:1:1。

字符串常量池

字符串常量池是Java中的一个特殊的存储区域,用于存储字符串常量。在Java中,字符串常量是不可变的,因此可以被共享。这样可以减少内存的使用,提高程序的性能。在JDK8中,字符串常量池存储在中。(String s="字符串"  先去字符串常量池中查找有无“字符串”对象,如果有的话,直接把该对象的地址赋值给s,如果没有的话,会去字符串常量池中创建对象:“字符串”,然后把字符串常量池中“字符串”的地址赋值给s。)

线程本地分配缓冲区(TLAB)

堆是所有线程所共享的区域,在多线程的环境下,在堆上创建对象是线程不安全的,故引出TLAB。堆内存Eden区划分出来的一块专用于原始线程进行对象分配的区域

它的主要目的是在多线程并发环境下需要进行内存分配的时候,减少线程之间对于内存分配区域的竞争,加速内存分配的速度。

TLAB是私有的,私有“只是指在”内存分配“上是线程独享的,也就是线程只能在自己的TLAB上给对象分配内存空间,但是仍然可以读取其他线程的TLAB

  • TLAB是如何分配的

tlab剩余可用空间>tlab可浪费空间,当前线程不能丢弃当前TLAB,本次申请交由Eden区分配空间。

tlab剩余可用空间<tlab可浪费空间,在当前允许可浪费空间内,重新申请一个新TLAB空间,原TLAB交给Eden(原TLAB的生命周期停止了)。

  • 创建的时机:

线程初始化时会创建TLAB。

gc时,在对象扫描完成之后,当线程第一次尝试分配对象的时候会创建TLAB。

  • TLAB生命周期
  • 当前

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值