JVM的五大内存区域的学习笔记

JVM的五大内存区域的学习笔记

 1,虚拟机栈

每个线程都会有自己单独的虚拟机栈,他们随着线程的创建而创建,随着线程的死亡也消亡。JAVA虚拟机会为了每一个即将运行的方法创建栈帧,比如,当a方法调用了b方法,虚拟机会首先让a入栈创建栈帧,接着让b入栈成为栈顶,接着b方法执行完之后出栈,最后才是a出栈。每个方法从开始调用到执行完成本质上都是一个入栈到出栈的过程。
虚拟机栈通常用于存储局部变量表,操作栈,动态连接,方法返回地址等。
线程请求的栈深度大于虚拟机允许的栈深度,将抛出StackOverflowError。
在这里插入图片描述

 2,本地方法栈

本地方法栈和虚拟机栈方法基本相同,不同的是虚拟机栈是为java方法服务,而本地方法栈则是为了本地方法服务,线程调用本地方法时,不受JVM管理。 在本地的方法可以通过JNI来访问本地方法栈的数据区。

   3,程序计数器

是线程的私有内存,可以记录线程的执行位置。

   4,方法区(jdk1.8之后 称为元空间)

所有的线程的共享的内存区域,用来存储已被虚拟机加载的常量,类信息以及静态变量。可以设置为不被GC的区域
在这里插入图片描述

   5,堆(GC主要发生的内存区域,也是重点调参区域)

被垃圾回收器管理的的主要区域,也是最重要的一部分区域。堆区是所有线程共享的内存区域,它占有的内存区域是所有内存中最大的。堆的内存大小可以调整,如参数 -Xms256m,-Xmx1024m 为初始容量为256m 最大容量为1024m 其中的ms为最小堆内存(memory start) mx为最大堆内存(memory max)一般来说,在生产环境下通常把JVM的初始值和最大值设置为一样的大小,这样可以避免垃圾回收的时候为服务器带来不必要的压力。

在这里插入图片描述

堆主要分为新生代 老年代和元空间(1.8之前被称为永久代),其中的新生代又被分为伊甸区,幸存者0区和幸存者1区。
所有的对象都会被初始化在伊甸区,在伊甸区满了之后会触发一次轻量的垃圾回收,还活着的对象会被送到幸存者0区,然后幸存区0变为幸存者1区,幸存者1区转变为幸存者0区(参考GC垃圾回收算法的复制算法)经历15次GC依然存活,或者幸存者区已经满了之后,虚拟机会把幸存者区依然存在的对象送往元空间,也就是永久带里,当线程请求分配内存,但堆已满,且内存已满无法再扩展时,就抛出OutOfMemoryError

值得注意的是:
1⃣️元空间使用的是本地内存!但是也有可能报出oom的错误!
2⃣️触发GC的条件:伊甸区对象满了会触发一次轻量级的GC,伊甸区对象满了会触发一次重量级的GC,触发了一定次数的轻量级的GC之后也会触发一次重量级的GC

以上是我的学习笔记和感悟,如有错误和遗漏,欢迎指正,万分感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值