虚拟机相关

内存图

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.初始化:按照顺序读取程序文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容