vlambda博客
学习文章列表

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


具体使用可以去查下文档就不多介绍了