星球狂想战队|清华扫地僧带你深入JVM调优实战,思路清晰,精通简直太容易( 三 )
在1.8之后已经取消了永久代 , 改为元空间 , 类的元信息被存储在元空间中 。 元空间没有使用堆内存 , 而是与堆不相连的本地内存区域 。 所以 , 理论上系统可以使用的内存有多大 , 元空间就有多大 , 所以不会出现永久代存在时的内存溢出问题 。 这项改造也是有必要的 , 永久代的调优是很困难的 , 虽然可以设置永久代的大小 , 但是很难确定一个合适的大小 , 因为其中的影响因素很多 , 比如类数量的多少、常量数量的多少等 。 永久代中的元数据的位置也会随着一次full GC发生移动 , 比较消耗虚拟机性能 。 同时 , HotSpot虚拟机的每种类型的垃圾回收器都需要特殊处理永久代中的元数据 。 将元数据从永久代剥离出来 , 不仅实现了对元空间的无缝管理 , 还可以简化Full GC以及对以后的并发隔离类元数据等方面进行优化 。
3.JVM的GC上面简单提到过 , 分别有三种回收现象:minor GC、major GC和full GC 。
3.1 如何确定某个对象(垃圾)是可回收3.1.1 引用计数法给对象中添加一个引用计数器 , 每当有一个地方引用它时 , 计数器就加1;当引用失效时 , 计数器值就减1;任何时刻计数器都为0的对象就是不可能再被使用的 。
这种方式的问题是无法解决循环引用的问题 , 当两个对象循环引用时 , 就算把两个对象都设置为null , 因为他们的引用计数都不为0 , 这就会使他们永远不会被清除 。
3.1.2 根搜索算法(可达性分析/可达算法)为了解决引用计数法的循环引用问题 , Java使用了可达性分析的方法 。 通过一系列的“GC roots”对象作为起点搜索 。 如果在“GC roots”和一个对象之间没有可达路径 , 则称该对象是不可达的 。 要注意的是 , 不可达对象不等价于可回收对象 , 不可达对象变为可回收对象至少要经过两次标记过程 。 两次标记后仍然是可回收对象 , 则将面临回收 。
比较常见的将对象视为可回收对象的原因:
- 显式地将对象的唯一强引用指向新的对象 。
- 大河客户端|布局战队,导师各有妙招,《2020中国好声音》收视率蝉联第一
- 周到|“好声音”蝉联省级卫视综艺节目收视第一,首迎抢位战导师布局战队各有妙招
- 游戏小怪兽|达仁星球:最新抖音直播留人控场方法和技巧
- 通天战队|A股最励志闻泰科技!给华为小米打工到半导体巨头,半年赚17亿
- |《街舞3》火舞台battle开启 钟汉良战队团魂之力势不可挡
- |《这!就是街舞》第三季火舞台热力喷发,队长领衔齐舞大秀燃炸战队之魂
- 生活狂想|极限男团新花名:任嘉伦可爱、贾乃亮浮夸、虞书欣的才叫脑洞大
- 时尚狂想曲|巴洛克风格衬衫搭配印花裙,杨紫挑战复古风,网友评价不一
- 时尚狂想曲|迪丽热巴入选亚洲最美面孔,抹胸衫配格纹裤,秀初秋风情
- 巅峰战队|ConcurrentHashMap的部分源码分析
