栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

gc在java中原理分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

gc在java中原理分析

本教程操作环境:windows7系统、java10版,DELL G3电脑。

1.GC堆内存

Java将堆内存分为3大部分:新生代、老年代和持久代,其中新生代又进一步划分为Eden、S0、S1(Survivor)三个区。

我们在程序中new出来的对象一般情况下都会在新生代里的Eden区里面分配空间,如果存活时间足够长将会进入Survivor区,进而如果存活时间再长,还会被提升分配到老年代里面。持久代里面存放的是Class类元数据、方法描述等。

(1)Minor GC(年轻代GC):

对象优先在Eden中分配,当Eden中没有足够空间时,虚拟机将发生一次Minor GC,因为Java大多数对象都是朝生夕灭,所以Minor GC非常频繁,而且速度也很快。

(2)Full GC(老年代GC):

Full GC是指发生在老年代的GC,当老年代没有足够的空间时即发生Full GC,发生Full GC一般都会有一次Minor GC。

(3)持久代(Permanent generation)也称之为 方法区(Method area):

用于保存类常量以及字符串常量。注意,这个区域不是用于存储那些从老年代存活下来的对象,这个区域也可能发生GC。发生在这个区域的GC事件也被算为 Major GC 。

2.GC执行条件

eden区空间不够存放新对象的时候,执行Minro GC。升到老年代的对象大于老年代剩余空间的时候执行Full GC,或者小于的时候被HandlePromotionFailure 参数强制Full GC 。调优主要是减少 Full GC 的触发次数,可以通过 NewRatio 控制新生代转老年代的比例,通过MaxTenuringThreshold 设置对象进入老年代的年龄阀值

3.GC算法原理

HotSpot 虚拟机采用了可达性分析来进行内存回收,可达性分析的基本思路就是通过一系列可以做为root的对象作为起始点,从这些节点开始向下搜索。当一个对象到root节点没有任何引用链接时,则证明此对象是可以被回收的。以下对象会被认为是root对象:

  • 栈内存中引用的对象

  • 方法区中静态引用和常量引用指向的对象

  • 被启动类(bootstrap加载器)加载的类和创建的对象

  • Native方法中JNI引用的对象。

以上就是gc在java中原理分析,相信经过本篇的学习理解,已经对基础的名词概念有所掌握。对于一些GC算法还不会使用的,可以再学完本篇文章后,回顾之前所学的知识内容。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/15125.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号