java虚拟机杂谈三jvm内存结构

jvm内存结构包括了虚拟机栈程序计数器方法区本地方法栈

  • 堆内存:堆内存主要存放java对象实例,所有线程共享,大部分新创建new的对象都会进堆内存,GC主要管理的内存,堆是是jvm中最大的一块内存,堆内部分新生代、老年代,新生代又分为eden区、from区、to区,不同区存放不同的对象,对应不同的GC回收算法。
  • 虚拟机栈:也称栈内存,栈是线程私有的,存放方法运行时数据,生命周期跟线程相同,线程销毁相对应的栈也销毁。栈描述的是Java方法执行的内存模型,每个方法的调用,都对应一个栈桢在虚拟机栈中从入栈到出栈的过程。每个方法被执行的时候都会同时创建一个栈桢,用来存储局部变量表,操作栈,动态链接,方法出口等信息。

     

  • 方法区:方法区是用于存储类结构信息的地方,包括常量池、静态变量、构造函数等类型信息,类型信息是由类加载器在类加载时从类文件中提取出来的。
  • 程序计数器:线程独享,保存着当前线程执行的虚拟机字节码指令的内存地址,作用可以看做是当前线程所执行的字节码的行号指示器。
  • 本地方法栈:本地方法就是native方法,为jvm调用本地方法服务。

 

其中,堆内存结构如下:

老年代与新生代的比例是2:1,新生代占堆内存的1/3,老年代占2/3,新生代中eden:from:to比例是8:1:1。

刚创建的对象一般都会先进入到eden中,新对象大部分存活周期不长,少数大对象会跨过eden直接进入老年代,新生代是 GC 收集垃圾的频繁区域。当对象在 Eden出生后,在经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳,则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中,然后清理所使用过的 Eden 以及 Survivor 区域 ( 即 from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁 ),这些对象就会成为老年代

 

GC 分为两种:Minor GC、Full GC 。

Minor GC 是发生在新生代中的垃圾收集动作,所采用的是复制算法。

Full GC 是发生在老年代的垃圾收集动作,所采用的是标记-整理-清除算法,当老年代内存不足时,触发fullgc,full gc发生频率远比minor gc低,fullgc需要扫描全部的堆内存,特别耗性能,发生fullgc时系统会停止运行,由于fullgc发生频率低,采用标记清除整理算法,也称标记压缩算法。

标记-压缩算法适合用于存活对象较多的场合,如老年代。它在标记-清除算法的基础上做了一些优化。和标记-清除算法一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记;但之后,它并不简单的清理未标记的对象,而是将所有的存活对象压缩到内存的一端;之后,清理边界外所有的空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值