内存图
java虚拟机内存图
虚拟机栈
虚拟机栈
- 栈帧是支持方法执行和方法调用的数据结构,每个方法的调用对应着一个栈帧的入栈出栈,栈帧中存放着方法相关的数据。
- 包含了方法的基本类型参数和对象引用,方法内的局部参数,返回到方法被调用的地址等。
- 如果线程请求的栈帧深度大于虚拟机所允许的深度,会抛出stackoverflowerror(栈溢出)。
- 如果栈动态扩展时无法请求到过多的内存,会抛出OutOfMemoryError(内存不足)
本地方法栈
和虚拟机栈的功能相同,唯一不同的是服务的方法是native方法。
方法区
- 存储的是已被虚拟机加载的类信息、常量、静态变量、编译器编译后的代码等数据。
堆
- 存放对象,所占内存最大,GC主要区域。
- 和栈一样,当没有内存为堆扩展时,会抛出OutOfMemoryError.
- 堆分为1/3新生代和2/3老年代。
- 新生代又分为eden,s0,s1,每次使用eden和s0,当GC之后,将存活的对象复制s1中,eden和s0清空,s0和s1互换,将s1或s0中的对象计数,每次GC后加1,当计数达到一定的值之后,将s1中的对象转到老年代。
- 老年代的对象存活时间比较久,当老年代满了之后,执行GC,采用标记-压缩算法内存回收。
堆GC的常见方法
1.标记-清除算法
在标记阶段,标记所有可达对象,在清除阶段,清除所有没有标记的对象,由于堆中的内存是不连续的,所有该发放容易产生大量内存碎片。
2.标记-压缩算法(老年代使用)
和标记-清除算法一样,只是在清除阶段,将已被标记的对象压到一端,清除另一端所有的对象。
3.复制算法(新生代使用,老年代中存活对象多,复制代价大)
将内存分为两块,每次先使用其中一块,当这一块满了的时候,将其中被标记的对象复制到另一块中,清理这一块。
jvm堆内存配置
- -Xms:初始分配内存,默认为物理内存的1/64。
- -Xmx:最大分配内存,默认为物理内存的1/4。
- 默认空余堆内存小于40%时,jvm堆内存就会增大到最大限制,空余大于70%时候,jvm就会减少堆内存直到-Xms的最小限制,因此一般设置最大最小堆内存相等。
类加载过程
1.加载:把类的.class文件读到jvm中。
2.连接:将二进制数据合并到虚拟机运行状态中去。
3.初始化:按照顺序读取程序文件。