JVM内存模型详解
👏👏👏
哈喽!大家好,我是【学无止境小奇】,一位热爱分享各种技术的博主!😍😍😍
⭐【学无止境小奇】的创作宗旨:每一条命令都亲自执行过,每一行代码都实际运行过,每一种方法都真实实践过,每一篇文章都良心制作过。✊✊✊
⭐【学无止境小奇】的博客中所有涉及命令、代码的地方,除了提供图片供大家参考,另外会在图片下方提供一份纯文本格式的命令或者代码方便大家粘贴复制直接执行命令或者运行代码。🤝🤝🤝
⭐如果你对技术有着浓厚的兴趣,欢迎关注【学无止境小奇】,欢迎大家和我一起交流。😘😘😘
❤️❤️❤️感谢各位朋友接下来的阅读❤️❤️❤️
文章目录
一、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设置的越小一个线程的栈空间越少,但是能创建的线程数就会越多。
相关文章
- failed to load the jni shared library jvm
- jvm之 国际酒店 一次报表 load数据死循环导致的FULLGC
- jvm 之 国际酒店 6月25日上线内存溢出原因
- jvm面试题
- Java内存管理:Java内存区域 JVM运行时数据区
- JVM内存区域
- 【JAVA】栈和堆,JVM内存概述
- java 15: jinfo查看jvm配置参数和系统属性
- arthas命令整理:基础命令、jvm相关、class相关命令
- jvm内存溢出分析实践案例:javax.crypto.JceSecurity大量BouncyCastleProvider实例无法被回收
- 【JVM与内存调优】内存泄露与内存溢出辨析
- JVM 架构 : 运行时数据区 & 内存结构
- Java Agent (JVM Instrumentation 机制) 极简教程
- 【图文详解系列】JVM 内存模型
- 【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 )
- 查看JVM内存使用情况
- Linux与JVM的内存关系分析
- JVM第六卷---类加载机制
- 【jvm优化超详细】常见的JVM调优场景
- JVM——System.gc、内存溢出、内存泄漏、STW、安全点、安全区域、强软弱虚引用
- JVM 在容器环境的内存配置
- 通过JConsoler监控Tomcat的JVM内存
- JVM 内存与 K8s 容器内存不一致引发的 OOMKilled 总结