【深入理解Java虚拟机】读后感:JVM垃圾回收小结
JVM垃圾回收小结
1.GC 问题侧重点
虚拟机栈、本地方法栈、程序计数器随线程而生,随线程而灭。栈中的栈帧随方法的进入和退出而有条不紊地执行着出栈与入栈操作,每个栈帧分配多少内存基本是在类结构确定下来时就已知了(尽管运行期会有JIT编译器进行一些优化)。所以这几个区域的内存分配和回收都具备确定性,不用过多地考虑回收问题,方法结束或线程结束,内存就自然随之回收了,而Java堆和方法区则不一样,我们只有在程序的运行期才知道需要创建哪些对象,这部分内存的分配和回收都是动态的,GC关注的也是这部分内存。
2.判定对象存活算法:
A.引用计数器(Java没有使用该算法),当有一个地方引用它时,就加1,引用失效就减1,任何时刻计数器为0即是死亡对象,使用者有:flashplayer,Python语言, Squirrel。缺点:很难解决对象之间的相互引用问题。
B.根搜索算法,通过一系列名为“GC Roots”的对象作为起始点,从这些节点向下搜索,所走路径叫做引用链,当一个对象到GC Roots没有任何引用链相连时(即从GC Roots到 对象不可达),该对象即是死的。(可作为GC Roots的对象有:虚拟机栈引用的对象,方法区类静态属性引用的对象,方法区常量引用的对象,本地方法栈中JNI引用的对象)
3.引用
A.强引用:代码中普遍存在的,类如:Object obj=new Object();,只要强引用存在,GC就永远不会回收它;
B.软引用:系统要发生内存溢出异常时,将会把这类对象放入回收范围,并进行第二次回收;
C.弱引用:该类对象只能生存到下一次GC发生前;
D.虚引用:对象是否有虚引用存在,不会影响其生存时间,也无法通过虚引用获得一个对象实例,只是用来在这个对象被回收时得到一个系统通知而已;
4.finalize()方法
在根搜索算法中不可达的对象,也并非是“非死不可”的,这时是处于一个“缓刑”阶段,对象真正死亡需要经历两次标记过程,如果根搜索算法不可达,会被标记一次,第二次标记才会死亡,第一次标记后,会看这个对象是否可以执行finalize方法(如果对象没有覆盖finalize方法或者之前已被虚拟机调用过则不可再执行finalize方法,即该方法只能被执行一次,下一次回收,该方法将不会被执行了)。若不可执行,只能等死,若可以执行,则会被放入一个F-Queue队列中,如果对象能在这时段重新与引用链上的任意对象建立关联,则成功拯救自己,否则,GC稍后会对F-Queue的对象进行二次小规模标记,如果没有关联上,则就真的离死不远了。
try-finaly或其他方式可能会比finalize方法做得更好,所以,不推荐使用这个方法。
5.Minor GC与Full GC
新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都是朝生夕灭的特性,所以Minor GC非常频繁,回收速度快。
老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC,大多会伴随至少一次的Minor GC,速度比Minor GC慢10倍以上
6.-XX:SurvivorRatio
-XX:SurvivorRatio参数设置Eden与survivor大小比值,而这里的survivor指survivor区域的一半,即=from space(survivor0)=to space(survivor1),故如设置-XX:SurvivorRatio=8,则Eden=8,from space=1,to space=1。
新生代中,一般情况下,from space(survivor0)与to space(suivivor1)大小相等,便于GC的时候相互复制。
7.-XX:+PrintGCDetails输出GC日志。
源自:《深入理解Java虚拟机:JVM高级特性与最佳实践》
【深入理解Java虚拟机】读后感:JVM垃圾回收小结相关推荐
- 【深入理解java虚拟机】 - JVM垃圾回收算法
文章目录 对象是否存活? 引用计数法 可达性分析法 强.软.弱.虚 finalize() 垃圾收集算法 分代收集理论 标记-清除算法 标记-复制算法 标记-整理算法 其他 垃圾回收算法细节实现 根节点 ...
- 《深入理解Java虚拟机》阅读——垃圾回收机制
<深入理解Java虚拟机>阅读--垃圾回收机制 前言 why--为什么需要垃圾回收 what--垃圾回收做些什么 where--去哪里回收垃圾 how--垃圾回收是怎么做的 垃圾是否要回收 ...
- 【一】深入理解Java虚拟机の内存与垃圾回收
[深入理解java虚拟机](https://www.zybuluo.com/Yano/note/321063) 目录 1.走进Java 2.Java内存区域 2.1 对象创建过程: 2.2 对象的内存 ...
- 深入理解java虚拟机(六)GC垃圾回收-低延迟垃圾收集器(Shenandoah、ZGC)
文章目录 前言 一.Shenandoah收集器 1.Shenandoah介绍 2.Shenandoah与G1对比 3.Shenandoah工作原理 4.Shenandoah并行整理的核心概念-Broo ...
- 深入理解java虚拟机(三)GC垃圾回收-对象存活算法
文章目录 前言 一.引用计数算法 二.可达性分析算法 三.了解引用 结尾 前言 在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还&qu ...
- 深入理解java虚拟机(五)GC垃圾回收-经典垃圾收集器
文章目录 前言 一.Serial收集器(标记-复制算法) 二.ParNew收集器(标记-复制算法) 三.Parallel Scavenge收集器(标记-复制算法) 四.Serial Old收集器(标记 ...
- 深入理解java虚拟机---读后笔记(垃圾回收)
运行时数据区,主要包括方法区.虚拟机栈.本地方法栈.堆.程序计数器,该部分内存都是线程隔离的. 然后和其交互的有执行引擎.本地库接口,此部分线程之间是可以共享的. 1. 引用计数算法 给对象添加一个引 ...
- 《深入理解java虚拟机》(Jvm)一篇概括
目录 1.Java内存区域与内存溢出异常 2.垃圾收集器与内存分配策略 3.虚拟机性能监控与故障处理工具 4.调优案例分析与实战 5.类文件结构 6.虚拟机类加载机制 7.虚拟机字节码执行引擎 8.类 ...
- 读书笔记之《深入理解Java虚拟机:JVM高级特性与最佳实践》
本篇带来的是周志明老师编写的<深入理解Java虚拟机:JVM高级特性与最佳实践>,十分硬核! 全书共分为 5 部分,围绕内存管理.执行子系统.程序编译与优化.高效并发等核心主题对JVM进行 ...
最新文章
- 1、存在如下数列1、1、2、4、7、13、24、44、81、149......现要求该数列第n项的值(n从O开始算)。 	程序运行结果: 	1/2 	输入:4 	输出:7 	输入:9 	输出:149
- JAVA SE学习day_15:thread线程池
- ROS知识【12】:用户的功能包覆盖系统功能包
- 在JavaScript中反转字符串的三种方法
- 安卓手机绘制uml图_Android Studio中绘制simpleUML类图详细说明及使用
- Spoken English-口语-单词背诵 3步法
- 批量从网上下载图片、zip等文件到本地[java爬虫]
- jsp+mysql 数据库操作
- HTTP请求的完全过程
- 学校计算机房的制度,小学计算机房管理制度
- spss可以关键词词频分析吗_词频分析研究的现状、方法及工具,你值得拥有
- 阿里云域名购买与备案,解析使用教程
- Unity导入Goolgle.Protobuf.dll报错
- 【千锋Python2205班10.8笔记-day11-函数基础(一阶段)】
- linux tar.xz 解压命令,Linux下.tar.xz文件的解压教程详解
- 荷兰DELTA电源维修SM66-AR-110德尔塔电源
- 将火狐浏览器默认搜索引擎设置为“百度”
- 程序员员为什么总是要加班呢?不加班会被开除吗?
- 新注册公众号没有留言评论功能怎么办?如何开通公众号留言功能?
- C语言编程>第十一周 ⑤ 请编写一个函数,用来删除字符串中的所有空格。
热门文章
- Warning:mysql_num_rows() expects parameter 1 to be resource,boolean given in F:.....\db_func.php onl
- VINS_FUSION编译运行
- markdown排版详解,Md2All实战
- Md2All,让公众号完美显示Latex数学公式
- “递归三要素”寻踪(浅析递归“经典”框架,领略递归优雅秀气;看到有“递归算法优化”的操作,余试剖之)
- Idea开发工具集成Drools插件
- oracle修改表字段名备注_oracle修改表名、列名、字段类型、添加表列、删除表列...
- Flink的两阶段提交
- linux ghost功能,在linux上用dd命令实现ghost功能(示例代码)
- 玩fifa服务器显示异常,fifa服务器链接异常