1,运行时内存图
2,具体区域介绍
线程私有区域:程序计数器、虚拟机栈、本地方法栈
线程共享区域:元空间、堆、直接内存
1>程序计数器:是一块很小的空间,主要用来当前多线程代码执行的位置,和下一条要执行的指令
2>虚拟机栈:在线程运行时,在执行每一个方法的时候,都会打包成一个栈帧放入Java虚拟机栈中。每一个栈帧存储了局部变量表、操作数栈、动态连接,方法出口等信息。局部变量表存储了编译器可知的各种数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。栈帧参数调整:栈帧的默认空间为1M,可使用-Xss调整。例如 -Xss256k
3>本地方法栈:和虚拟机栈一样,只不过这个空间只分配给本地方法
4>堆:Java虚拟机所管理的最大空间,是所有线程共享的一块空间。此区域主要的目的就是保存创建出来的对象实例,几乎所有的对象实例和数组对象都会在这里分配空间。随着逃逸技术(如果某些方法中的对象实例没有被返回或者没有在该方法外使用就是未发生逃逸)的逐渐成熟,栈上分配(将对象实例打散存储到java虚拟机栈中)和标量替换优化技术使得所有的对象都在堆中分配空间不那么绝对。
java堆是垃圾回收器主要负责的区域,所有堆又称为GC堆。从垃圾回收的角度来看的话,堆又可以分为新生代、老年代,新生代又可细分为Eden、From survivor、To survivor空间,进一步分划是为了更好的进行GC垃圾回收
堆空间调整:-Xms 堆的最小值; -Xmx 堆的最大值; -Xmn 新生代的大小
-XX:NewSize 新生代的最小值; -XX:MaxNewSize 新生代的最大值
栈上分配配置:
-server JVM运行的模式之一, server模式才能进行逃逸分析, JVM运行的模式还有 mix/client
-Xmx10m和-Xms10m:堆的大小
-XX:+DoEscapeAnalysis:启用逃逸分析(默认打开)
-XX:+PrintGC:打印GC日志
-XX:+EliminateAllocations:标量替换(默认打开)
-XX:-UseTLAB 关闭本地线程分配缓冲
对栈上分配发生影响的参数就是三个,-server、-XX:+DoEscapeAnalysis和 -XX:+EliminateAllocations,任何一个发生变化都不会发生栈上分配,因为启用逃逸分析 和标量替换默认是打开的,所以,在我们的例子中,JVM的参数只用-server一样可以 有栈上替换的效果
5>元空间:用来保存一些常量、类加载信息等