IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 读《深入理解Java虚拟机,JVM高级特性和最佳实践》笔记|垃圾回收概念 -> 正文阅读

[PHP知识库]读《深入理解Java虚拟机,JVM高级特性和最佳实践》笔记|垃圾回收概念

方法区的垃圾回收

方法区存放着一些常量(字符串,整型…),类的信息(Class),

且在1.7中位于永久代(Permanent General),发生垃圾收集的可能比较小,

但并非不会进行垃圾收集,

方法区的收集主要分为两部分

1.废弃的常量

当没有引用再指向一个常量时,也就是程序无法再获取到该常量时,(和对象的死亡差不多)

当进行垃圾收集时,垃圾收集器觉得有必要的话,会对该废弃常量进行收集

2.不使用的类型Class类

回收Class类型的条件比较苛刻,必须满足以下条件

该类的所有实例都以回收,也就是堆中没用该类的对象
加载该类的类加载器已经回收,(很难达成)
该类所对应的Class类对象没用被任何引用,不能被反射使用

显示类的加载和卸载信息的JVM参数(只能在product版本的虚拟机中使用)

-verbose: class
-XX: +TraceClass-Loading
-XX: +TraceClassUnloading

本来想换以下jdk版本试一试上诉的参数,下了新版jdk又觉得挺麻烦,还是不搞事了

分代收集理论

大多数的虚拟机的垃圾收集器的工作都基于分代收集理论

垃圾收集器的一致性收集原则,即将Java堆划分出一定的区域,按区域对对象进行存储和收集

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6gyLTUWZ-1631979190654)(F:\LocalTyproPictrue\s1231231.png)]

Young GC/Minor GC 指目标只是新生代的收集
Major GC/Old GC 指目标只是老年代的收集,(只有CMS收集器会有只收集老年代的行为,在一些资料上与整堆Full GC混淆,)
Mixed GC 指目标是整个新生代和部分老年代的收集(目前只有G1 收集器支持)
Full GC 指对整个Java堆和方法区的收集

使用-XX:+PrintGCDetails把jdk17的垃圾日志打开看一看

请添加图片描述

再对比以下正在使用的jdk8的垃圾收集日志

请添加图片描述

这里明确的将新生代划分为了

**eden,from,to三个区,**但日志并没有告诉使用的是什么垃圾收集器

那去cmd里查一下

请添加图片描述

放到网上查了一下

ParallelGC代表

请添加图片描述

但垃圾收集日志的老年代显示的为ParOld,明显使用了ParallelOld堆老年代进行收集,

这是因为在开启UserParallelGC的环境下,也会默认开启UserParallelOldGC,所以使用了ParOld

这里有一个具体说明的连接

JVM默认老年代回收是 PSMarkSweep(Serial-Old) 还是Parallel Old? - 知乎 (zhihu.com)

所以不同的垃圾收集器设计上还是有很大区别的

垃圾收集算法

1.标记----------------清除算法

最基础的垃圾回收算法

算法分为标记和清除两个过程

概念:标记出所有需要回收的对象,完成后统一回收所有标记的对象

二个缺点

1.大量的标记和清除动作,执行效率不稳定

2.空间碎片化,导致出现内存碎片,不利于之后大对象的创建

请添加图片描述

2.标记----------------复制算法

也是现在大多数垃圾收集器使用的算法

上述的jdk8的垃圾收集日志也可以验证

概念:将内存划分为两块,每次只使用其中一块,但使用的那一块内存用完了,

? 就将其中还在使用的对象(活着的对象)复制到没使用的内存,

? 再将使用过的那块内存清空

优点:不会产生内存碎片。

? 简单,操作效率高

缺点:浪费了一半的内存空间

请添加图片描述

(Appel式回收:将新生代分为一个Eden区,和两个较小的survivor区,每次使用Eden区和一个survivor区,当发生垃圾回收时,将Eden区和使用的survivor区的存活对象复制到林一个survivor区,然后清除调Eden区和使用过的survivor区)

Hotspot虚拟机将Eden区和survivor区的比例设置为8:1,因为有两个survivor区,所有每次可使用的新生代空间总是为90%,

当survivor区在一次MinorGC时无法容纳全部的存活对象时,需要借助其他的内存空间,(进入老年代内存?)

3.标记----------------整理算法

针对上诉标记,复制算法不适合在老年代进行收集(如果对象的存活率较高,则需要频繁的进行对象的复制,而对于存活率较高的老年对象不适合频繁的复制和移动)

概念:在标记了所有的存活对象后,将所有对象都向内存的一边移动,然后在将边界外的内存全部清空(与标记----清除算法的区别是,前者是非移动式的,后者是移动式的)

请添加图片描述

对象移动操作的利弊

对象的移动操作需要全程暂停用户程序,(不然肯定会有内存错误了),

这种暂停被称为 ‘Stop the world’ (幻视 The world扎瓦鲁多)

但如果不移动虽然能够减少这种暂停所需要的时间,但也会造成内存的碎片(影响程序的吞吐量)

PS(Parelle Scanvenge关注吞吐量的,采用标记整理,CMS则是标记—清除)

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 07:45:54  更:2021-09-19 07:46:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 7:14:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码