Java JVM内存结构剖析笔记
资源
[Oracle 各版本](https://www.oracle.com/java/technologies/javase/)
[JDK8文档](https://www.oracle.com/java/technologies/javase-jdk8-doc-downloads.html)
[Java虚拟机字节码](https://cloud.tencent.com/developer/article/1333540)
JVM 细化 如图
虚拟机栈:有的虚拟机虚拟机栈和本地方法栈已经合二为一。
栈帧组成 如图
可以用javap -c xxx.class 查看反汇编执行流程,我们在idea的编译器也可以用ASM的相关插件查看
方法区:
通常存放的是,类信息,常量,静态变量,及时编译后的代码
Java堆:
对象实例(几乎所有),数组。java堆大小设置参数-Xms 起始内存,-Xmx 上限大小
Java <= 1.7 永久代(具体的关键字上网搜索了解下吧)
Java >= 1.8 元空间 (假设15G)
好处:方便了扩展
坏处:挤压堆空间
-Xmx 最大的上限制(10G)那么剩下留给使用的就只有(5G)
-Xms 初始分配内存(假设2G)
本地内存(堆外内存):使用NIO的操作回频繁使用,在Java堆内存可以通过directByteBuffer等直接引用。收到本地总内存限制也会出现OOM大小,可以用MaxDirectMemeorySize 进行限制
从底层理解运行时内存区:
堆内包含:EGEN,FROM,TO,Tenured(OLD)
1 申请内存
2.类加载---class进入到了内存
3.常量,静态变量 入方法区
4.虚拟机栈----入栈帧(比如main方法)
5.执行栈方法
比如
Teacher t = new Teacher();
t 这类引用进入虚拟机栈
实例new Teacher() 在堆中
我们的对象Teacher()通过一般(15次GC,虚拟机年龄)(文档描述大概是这个样子)从Eden->From->To->Tenured(OLD) 变成老年代进行回收
HSDB 工具:
几人如你JAVA_HOME/lib 目录
java -cp ./sa-jdi.jar sun.jvm.hotspot.HSDB
就会出现这个监控JVM的强大工具
用JPS去查看java进程会发现HSDB,但是我们找到的是我们需要监控的进程号。或者
ps -ef| grep java
具体使用可以去查下文档就不多介绍了