zl程序教程

您现在的位置是:首页 >  后端

当前栏目

JVM内存模型详解

JVM内存 详解 模型
2023-09-11 14:22:53 时间

👏👏👏

哈喽!大家好,我是【学无止境小奇】,一位热爱分享各种技术的博主!😍😍😍

⭐【学无止境小奇】的创作宗旨:每一条命令都亲自执行过,每一行代码都实际运行过,每一种方法都真实实践过,每一篇文章都良心制作过。✊✊✊

⭐【学无止境小奇】的博客中所有涉及命令、代码的地方,除了提供图片供大家参考,另外会在图片下方提供一份纯文本格式的命令或者代码方便大家粘贴复制直接执行命令或者运行代码。🤝🤝🤝

⭐如果你对技术有着浓厚的兴趣,欢迎关注【学无止境小奇】,欢迎大家和我一起交流。😘😘😘

❤️❤️❤️感谢各位朋友接下来的阅读❤️❤️❤️

一、JVM内存模型

1、JVM虚拟机

1.1、虚拟机栈

存放局部变量

栈帧:
1.局部变量表:存放局部变量。
2.操作数栈:数据在计算过程中需要一块中转内存空间用来存放,就是操作数栈。
3.动态链接:在程序运行过程中,将符号引用变为直接地址引用。
4.方法出口:指向调用该方法的其它方法。例如A方法第三行调用B方法,那么B方法的方法出口指向A方法的第四行。

1.2、本地方法栈

运行native本地方法。调用c语言编写的代码。

1.3、堆

new一个对象就会放到堆中

1.4、方法区

常量,静态变量,类信息

1.5、程序计数器

存放当前线程运行到哪行代码的行号,为了是如果此时cpu去运行别的线程后再返回来的时候可以知道之前运行到哪里了,可以接着运行。

2、堆详解

2.1、年轻代-Eden区

新new的对象会先放入Eden区中。

2.2、年轻代-Survivor区

Survivor区中有两个相同大小的区域,为S0和S1区,当Eden区满了的话,会进行Minor Gc,将存活的对象放入到S0中,然后将Eden区中的垃圾对象全部清理,当Eden中又满了的话,会将Eden中存活的对象和S0中存活的对象一起放入S1中,依次类推。当存活次数达到15次,对象就会被放入到老年代中。

2.3、老年代

对象在年轻代存活15次后会被放入老年代中。当老年代放满了后会进行Full Gc。

二、STW

1、停止用户线程

1.1、停止用户线程

在进行Minor Gc或者Full Gc的时候会停止用户线程,用户会感觉到卡顿。Full Gc卡顿比Minor Gc
更严重,所有我们要避免程序经常Full Gc。

三、方法区详解

1、方法区容量动态伸缩

1.1、默认初始

方法区默认初始值为21M,当方法区满了的话也会触发Full Gc,所以我们一般会手动设置方法区的容量,设置方法区的初始值和最大值命令: -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256

四、线程栈空间设置

1、线程栈空间设置

1.1、含义

线程栈是我们每一个线程中栈的总大小,默认为1M,可以通过命令修改:-Xss128k
结论:-Xss设置的越小一个线程的栈空间越少,但是能创建的线程数就会越多。