JVM运行时数据区、GC垃圾回收-创新互联

目录

成都创新互联公司主要从事做网站、网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务册亨,10余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792

一、 运行时数据区

1. 程序计数器

2. Java虚拟机栈

3. 本地方法栈

4. Java堆

5. 方法区

二、 堆内存区域划分

三、 GC垃圾回收机制

哪些内存需要回收?

垃圾收集算法

1、标记-清除

2、复制算法 

3、标记-整理算法

4、分代收集算法 


一、运行时数据区 1. 程序计数器

程序计数器用来存储下一条指令的地址,即将要执行的指令代码。由执行引擎读取下一条指令。

java中最小的执行单位是线程,因为虚拟机的是多线程的,每个线程是抢夺cpu时间片,程序计数器就是存储这些指令去做什么,比如循环,跳转,异常处理等等需要依赖它。

2. Java虚拟机栈

描述的是Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息,每个方法从调用直至执行完成的过程,都对应这一个栈帧在虚拟机栈中入栈到出栈的过程

3. 本地方法栈

与虚拟机的作用是相似的,只不过虚拟机栈是服务Java方法的,而本地方法栈是为虚拟机调用Native方法服务的

4. Java堆

是Java虚拟机中内存大的一块,是被所有线程共享的,在虚拟机启动时候创建,Java堆唯一的目的就是存放对象实例,几乎所有的对象实例都在这里分配内存,是垃圾回收的重点区域。

5. 方法区

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。

二、堆内存区域划分

Java8及之后堆内存分为:新生区(新生代)+老年区(老年代)

新生区分为Eden(伊甸园)区和Survivor(幸存者)区

划分

三、GC垃圾回收机制

哪些内存需要回收?

1、引用计数法

给对象中添加一个引用计数器,每当一个地方引用这个对象时,计数器值+1;当引用失效时,计数器值-1。计数值为0的对象就是不可能再被使用的,在主流的JVM中没有选用引用计数法来管理内存,最主要的原因是引用计数法无法解决对象的循环引用问题,造成内存泄漏

2、可达性分析法

这个算法的基本思想是通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链时,则此对象是不可用的。

方法区的垃圾回收主要回收两部分内容:1. 废弃常量。2. 无用的类

垃圾收集算法         1、标记-清除

2、复制算法 

3、标记-整理算法

4、分代收集算法 

划分

年轻代(Minor GC/Young GC)使用复制算法

Minor GC/Young GC的过程
1. 正常新创建的对象会直接进入eden区,当eden区内存满了时,触发Minor GC。
2. 首先对eden区存活的对象通过可达性分析法进行识别,并对其进行标记
3. 将eden区中存活的对象和servivor0中的对象复制到servivor1中
4. 对eden区中的垃圾进行清除
5. 当下一次Minor GC来临时,先执行步骤2,再将eden区中存活的对象和servivor1中的对象复制到servivor0中,最后执行步骤4,以此类推
6. 每经过一轮Minor GC,存活的对象年龄+1,在满了15时,对象直接进入老年代

老年代 (Full GC/Major GC)使用标记整理算法,当老年代中的内存满了时,触发Full GC

Full GC/Major GC的过程

  1. 新生代的对象在年龄足够或新生代中存放不下的大对象进入老年代中
  2. 当老年代中的内存满了时,触发Full GC
  3. 首先对eden区存活的对象通过可达性分析法进行识别,并对其进行标记
  4. 然后让所有存活对象向一段移动
  5. 最后直接清理掉端边界以外的内存

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前名称:JVM运行时数据区、GC垃圾回收-创新互联
当前网址:http://myzitong.com/article/dhhijd.html