对JVM内存模型的理解

JVM内存模型:

JVM会为每个线程分配独立的空间,用来进行本线程的运算。因此内存模型构成有线程独有的,也有线程共享的。

  1. 程序计数器(PC) 线程独有的,是一块较小的内存空间。 记录本线程下一步要执行的指令,通过改变PC值来运行不同行的字节码。
  2. 栈(stack) 线程独有的,在线程启动时系统就会分配一个连续的、大小固定的内存空间,这个空间大小可以配置。  简单理解就是存储线程运行时需要的引用类型对象的引用,以及基础数据类型变量,, 在线程运行过程中,栈中会存储一个个栈帧,方法的每次调用会向栈中压入一个栈帧,,栈帧由局部变量区和操作数栈组成。局部变量区存储着基本数据类型、方法中局部变量和方法参数;操作数栈存放方法执行过程中产生的中间结果。 调用深度大于允许深度(栈中存储的数据大于栈内存容量)时会报StackOverFlow,,请求内存不足会报OutOfMemoryError。
  3. 本地方法栈  与栈类似,支持native方法执行,存储每个native方法调用的状态。也会抛出StackOverflowError 和OutOfMemoryError。HotSpot虚拟机将本地方法栈与栈合并。
  4. 堆(heap) 线程共享的,是虚拟机内存中最大的一块,存储绝大多数对象实例,最需要注意的一块区域。堆内存是由JVM自动化管理的,垃圾只能由JVM自己回收。堆中每个对象都有一个地址被称作它的引用   堆内分为新生代和老年代, 新生代又分为eden区和两个同样大小的survivor区(from、to),分配在堆内的对象会先存储在eden区,经过gc后进入当前使用某个的survivor区,survivor区内的对象在经过一定次数的gc后进入老年区。
  5. 方法区  线程共享的,有时也叫永久代(1.8后改为元空间),存储运行过程中加载的类信息,包括静态变量、常量、类方法等。内部有运行时常量池,存储编译时或运行中生成的常量。

TLAB区域 

在堆内分配对象需要加锁,这样开销会比较大。因此HotSpot的jvm在堆内eden区加入了TLAB(Thread Local Allocation Buffer)区域,用于做线程专用的对象缓冲区,存储运行过程中的用完即丢的小对象。TLAB区域比较小,可以通过

-XX:TLABWasteTargetPercent设置TLAB区域栈eden区的百分比。 

当比较大对象的尝试存入TLAB区域而TLAB区域空间不够时,,TLAB中有一个RefillWaste值。当TLAB中空闲空间小于RefillWaste时,允许丢弃这个TLAB再重新尝试请求分配一个TLAB用来存储;当空闲空间大于RefillWaste时,表示这个TLAB空间不能直接丢弃,而这个对象直接在堆内存储不进入TLAB。这个浪费比通过-XX:TLABRefillWasteFraction调整。

TLAB会动态地调整大小和RefillWaste,可以通过-XX:-ResizeTLAB禁用这个自动调整功能,-XX:+TLABSize指定TLAB区域大小。

JVM图

堆和方法区作为公共区域由所有线程共享,线程对方法区的读写需要锁机制,,每个线程会有自己的PC、栈、本地方法栈,维护着本线程的运行,堆上还会在eden区为每个线程分配一个tlab区域。

堆内分为新生代和老年代,新生代分为eden区和两个同样大小的survivor区域from space、to space。堆内存储的对象大部分会直接存储在eden区,eden区存不下的大对象会直接存入老年代。eden区的对象绝大部分都会在发生GC时被清除,经过一次GC的会被放入某个survivor区域。

from、to两个区域同一时间只启用一个用来存储GC存活对象,当新生代内存无法满足要求时,发生新生代GC,将eden区和启用的survivor中的存活对象复制到另一个未使用的survivor中,然后清除eden区和原来的survivor。经过多次GC还存活的对象会进入老年代。

JAVA创建对象的过程

User u = new User(); 

将User类信息装在到方法区, User u在栈中分配一个存储User对象的空间, new User()会尝试创建对象。首先尝试在TLAB创建,如果TLAB区域存不下,则将对象存在eden区,然后将引用写入栈中。 我觉得方法区管类信息,堆管对象存储,栈管线程运行。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值