JVM内存结构
运行时数据区
-
JAVA运行时内存划分堆,方法区,虚拟机栈,本地方法栈和程序计数器。
-
线程私有的有:
- 程序计数器
- 虚拟机栈
- 本地方法栈
线程共享的有:
- 堆
- 方法区
程序计数器
用来记录当前线程执行的位置(下一条需要执行的字节码指令)。
虚拟机栈(栈)
- Java栈中存储的是栈帧,每一次函数调用,对应的栈帧会被亚茹到Java栈中。
- 栈帧的内存结构:局部变量表,操作数栈,动态链接,方法出口信息。
- 设置栈大小:
-Xss2M
本地方法栈
虚拟机调用的Native方法。
方法区
用来存储被虚拟机加载的类信息和运行时常量池。
1.8 之后方法区存放在元空间。
堆
-
可以细分为新生代和老年代,新生代分为Eden区,From Survivor区,To Survivor区。
-
对象如果在新生代存活了足够长的时间而没有被清理掉(即在几次Young GC后存活了下来),则会被复制到老年代
-
如果新创建对象比较大(比如长字符串或大数组),新生代空间不足,则大对象会直接分配到老年代上(大对象可能触发提前GC,应少用,更应避免使用短命的大对象)
-
补充一下,静态变量和字符串常量池是存放在堆空间的。
-
设置堆内存大小,
-Xms1M -Xmx2M