- java虚拟机内存主要分为堆内存、栈(线程)内存、本地方法栈内存、元空间(静态方法区)以及程序计数器。
1、堆内存:
主要存放new出来的对象和全局变量。
2、栈内存(线程):
每个内存都有一个单独的线程。主要存放局部变量、对象的引用、动态链接以及方法出口。
在栈内存中,每个线程都会重新分配一块内存,每一个内存就是一个栈帧。
在每个栈帧中,又会分为多个内存,这些个内存分别存放着局部变量、对象引用、动态链接和方法出口。如上图。
3、程序计数器:
通过javap命令反编译出来的class文件,可以通过jvm指令集查看具体的程序流程。而每一个指令都会有个计数器。程序计数器就是用来记录需要执行的下一行指令的位置。
4、元空间:
用来存储静态方法、静态变量和类元信息,元信息是类加载完成之后类的所包含的所有信息。
并且元空间中的数据在jvm启动的过程中只加载一次。
5、本地方法栈:
java自带的本地方法(native修饰的),在加载这类方法的时候,就会将方法加载入本地方法栈中。
- java虚拟机垃圾回收主要发生在堆内存中,所以我们有必要详细了解一下堆内存中是什么样的结构。
话不多说先上图:
如上图, 堆内存主要分为年轻代和年老代:
1、年轻代:包括eden区和survivor区。而survivor区又分为两个大小相同的区,成为s0和s1。
当一个new的对象进入堆内存中的时候,首先进入eden区,当eden区大小超过一定界限时,发生minor gc(轻gc),
将还存活的对象放入到survivor区中。而这些对象如果有存活的,就在s0和s1两个区域当中循环,大概循环15次。如果还有存活的对象就放入老年区。
2、年老代:当年老代的的空间达到一个界限之后,就发生full gc(重gc)。如果此时的内存占用太多,就会发生内存溢出。
- jvm调优工具https://gceasy.io
- 常用的jvm内存检测工具是安装jdk之后在cmd中输入jvisualvm,如果需要查看堆内存的具体数据,需要安装一个gc插件。