JAVA 虚拟机,你需要了解这些(内存模型,垃圾收集机制,垃圾收集算法)

 2019-12-10 16:02  阅读(926)
文章分类:Java Core

1、内存模型

JVM 把内存分为了5个大的区域

程序计数器 线程私有 很小的一块区域存放当前正在执行的字节码指令唯一一块不会抛出任何异常的区域
程序计数器 线程私有 很小的一块区域存放当前正在执行的字节码指令唯一一块不会抛出任何异常的区域
java虚拟机栈 线程私有 会抛出OOM异常和  StackOverflowError存储了方法执行时相关信息(栈帧)
本地方法栈 线程私有会抛出OOM异常和  StackOverflowError存储本地方法(也就是native修饰的函数)调用相关信息和java虚拟机栈统称栈
方法区 线程共有  会有并发问题会抛出OOM异常存储的是每个class的信息包括,类名,属性名,函数名等函数的代码,和 运行时常量池 
线程共有并发问题主要发生在这里最大的一块内存区域,这一个区域又被分为了几个小的区域年轻代:老年代,大小比例默认为 1:2新new出来的对象基本都在年轻代(大对象会直接进入老年代),新生代的对象大部分都是朝生夕死,经过多伦(默认15)moinergc依然存货的对象会进入老年代年轻代GC一般采用标记复制算法,存活的对象都复制到  survivor区域。老年代的对象存活率比较高,这里发生的GC叫FullGC一般采用CMS算法(标记整理算法)或者G1算法(jdk1.9后默认的)

jvm 标记一个对象是否是垃圾的方法:

1、引用计数法 – 无法解决循环引用问题

2、对象可达性分析 – 从根对象搜索,无法到达的对象未垃圾对象,需要被回收 – 三色标记法就是该算法的实践

垃圾回收

年轻代 – 标记复制算法

年轻代按照 8(eden):1(survivor0):1(survivor1) 被分为三块区域

初始状态 survivor 2个区域都为空,经过第一轮GC后会吧 存活对象复制进 survivor0 区域,在清空 eden 区域,当 survivor0 区域满了后会复制进 survivor1 区域survivor1 区域满了后会进入 老年代,并且 survivor0 和 survivor1 会始终保持一个区域为空,

老年代 – 标记整理算法(CMS 算法)

会分为几个步骤

1、初始标记

2、并发标记

3、重新标记

4、并发处理

对象在标记过程中,根据标记情况,分成三类:

  1. 白色对象,表示自身未被标记;
  2. 灰色对象,表示自身被标记,但内部引用未被处理;
  3. 黑色对象,表示自身被标记,内部引用都被处理;

更多 JAVA 相关问题关注小程序,如果对你有用帮忙点下广告,谢谢!!

20191210001505\_1.png

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> JAVA 虚拟机,你需要了解这些(内存模型,垃圾收集机制,垃圾收集算法)

相关推荐