==============对象是否生存======================
引用计数法:
给对象添加一个引用计数器,每当有一个地方引用它的地方,计数器值+1;当引用失效,计数器值就减1;任何时候计数器为0,对象就不可能再被引用了。
引用计数法的缺陷(相互引用)p63
ReferenceCountingGc A=new ReferenceCountingGc (); ReferenceCountingGc B=new ReferenceCountingGc (); A.instance=B; B.instance=A; A=null; B=null;
在这个场景下,A,B的计数器应该为1,但是AB却没有被引用。在GC时,AB被回收掉,说明JVM不是使用的计数器。
可达分析性算法
算法的基本的思想是通过一系列的称为"GC ROOTS"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连,就说明对象不可用。
可以作为Gc Roots的对象包括下面几种:
方法去中类静态属性引用的对象。
方法区中常量引用的对象。
方法区栈中JNI引用的对象。
========根据引用的生命周期长短分类(以下是我自己的理解不是书里==========================
强引用(Strong Reference)
即代码中普遍存在的new 出来的对象引用。在对象未存活时,被gc掉。
软引用(SoftReference)
继承自SoftReference或者使用new SoftReference(new Object()),如果放入SoftReference的对象A,除了softreference以外没有其他地方引用,那么JVM在full gc时会回收掉此引用。
弱引用(weakReference)
同SR,不过如果没有其他地方引用,会在下一次GC时回收掉。
虚引用(PhantomReference)
不会对对象的生存时间构成影响,只是在对象被收集器回收时收到一个系统通知。
=================Finalize()方法===============================
要真正宣告一个对象是死亡的,至少经历两次标记过程,如果对象在进行可达分析后发现没有引用链,则会标记一次毕竟进行筛选,筛选的条件是此对象是否有必要执行finialize().当对象没有覆盖finialize()方法或者finalize()方法已经被虚拟机调用,则被视为”没有必要执行“。
对于有必要执行的情况,对象会被放到一个F-Queue队列里,由一个低优先级的Finalizer线程去执行。但所谓执行,并不承诺会等待它结束,这样的做的原因是finalize()方法可能会很慢或者死循环,导致F-Queue队列的其他对象处于等待。稍后GC会对F-Q里的对象第二次标记,如果F方法没有再次将对象进行关联,那么他将会被回收。另外finallize()方法只会被系统调用一次。
===================垃圾回收算法=================================
算法1:标记清除算法(Mark-Sweep)
分为标记和清除两个阶段。
缺陷:效率问题,产生大量不连续空间。(个人理解适合不频繁内存区域的回收)
算法2:复制算法 (Copying)
分配两个大小相同的的块,每次只是用一块,当这一块的内存用完时,将还存活的对象复制到这一块上面。并把之前是用的块清空。
在新生代回收算法中,Eden Suvivor去按照8:1:1的比例分配。当回收时,将Eden和Survivor中还存活的对象一次性地复制到另一块Survivor区中,并清理掉Eden区和刚才用过的Survivor区。
我们没有办法保证每次回收都只有不到10%的对象存活,当Survivor空间不够用时,需要其他内存(老年代)进行担保。如果另一块Survivor空间没有够用空间存放上次新生代收集下来存活的对象时,这些对象将直接分配担保机制进入年老代。
=============一些回收规则=============================
1.大多数情况下,对象在新生代Eden分配。当Eden区没有足够空间进行分配,虚拟机会进行一次Minor GC。MGC发生的一般比较频繁,而且回收速度也很快。
2.大对象直接进入年老代。虚拟机提供一个-XX:PretenureSizeThreshold参数,令大于这个设置值的对象直接在老年代分配。这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存复制。
3.长期存活的对象进入年老代。虚拟机给每个对象定义一个对象年龄计数器。如果对象在Eden出发并经过第一次 MinorGC后仍然存活,并且能够被Survivor容纳话,将会被移动到Survivor区中,并将对象年龄设为1.对象在Survivor区经历过一次MGC,年龄就会加1。当对象年龄增加到一定程度,默认15岁时,就会被晋升到老年代。晋升的阈值,通过-XX:MaxTenuringThreshold设置。
4.动态对象年龄判定。如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。无需等MaxTenuringThreshold。
5.空间分配担保。JDK 6Update 24之后规则变为只有老年代的连续空间大于新生代对象总和或者历次晋升的平均大小就将会进行MGC,否则进行FGC.
相关推荐
深入理解Java虚拟机学习笔记借鉴.pdf
NULL 博文链接:https://zhanjia.iteye.com/blog/1842733
NULL 博文链接:https://zhanjia.iteye.com/blog/1842242
java虚拟机源码学习 Understanding the JVM 深入理解Java虚拟机第三版 (周志明)源码及学习笔记
的第三部分。第四部分对应于原书的第四部分,程序编译与代码优化,不过仅对 Java 的运行期优化,也就是 JIT 时进行的优化进行了总结,编译器优化部分尚未进行深入研究。 阅读方法: 本 repo 的 README.md 从头读到尾...
本repository为《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记,因为第一章主要讲的是Java的发展历史,这里就不做笔记,直接从第2章的"Java内存区域与内存溢出异常"讲起。 第二部分 自动内存...
深入理解JVM&G1GC Java并发编程的艺术 java并发编程实战pdf及源码 Java虚拟机(第二版) 实战JAVA虚拟机JVM故障诊断与性能优化 HotSpot实战 Java虚拟机精讲 Kubernetes权威指南:从Docker到Kubernetes实践全接触...
深入java虚拟机光盘资源Ubin 计划第 2 阶段 - 法定人数 该存储库包含 Project Ubin Phase 2 中 Quorum 原型的源代码和测试脚本。 Ubin Phase 2 是一个协作设计和快速原型设计项目,探索使用分布式账本技术 (DLT) ...
JAVA--达内培训笔记】 1、Java之父Golsling 1995年5月23日 Java诞生 1998年12月 1.2版本 Java2 J2SE J2EE J2ME 2004年12月 1.5版本(5.0) Java JavaSE JavaEE JavaME 2、Java SE --- Java标准平台 Java EE -...
深入理解java虚拟机:jvm高级特性与最佳实践源码现代操作系统,第 4 版 作者:Andrew S. Tanenbaum, Herbert Bos ** Notes by Henry Cooksley ** 1 介绍 操作系统、外壳、GUI、图形用户界面、内核模式、主管模式、...
语言相关的API,第三方库和计算机基础理论等知识的学习和整理 更多 : | | 目录 资源 详细目录 Java语言和JDK源码 Java语言的基础理论知识 并发编程 Java并发编程相关的内容,并发包源码分析等 集合框架 Java集合框架...
Notebook 欢迎你来到我的笔记本 本github中写的都是笔记记录,其中内容大部分来源于网上优秀博文或者经典书籍,因此不推荐阅读我的笔记,只是我个人使用为主...第3章:抽象队列同步器 第4章:并发与集合总结 第5章:Has
JVM内在结构的图解文档,visio格式 1.编译过程 2.内存结构 3.对象与类的结构 4.类结构信息 5.对象建立过程 6.收集器 7.方法调用 8.垃圾回收 9.JIT 10.指令 11.线程
├─4.01 jvm虚拟机常识-什么是java虚拟机-java如何做到跨平台.mp4 ├─4.02 jvm虚拟机常识-虚拟机结构.mp4 ├─4.03 jvm虚拟机常识-虚拟机堆内存结构.mp4 ├─4.04 jvm虚拟机常识-jvm虚拟机参数类型-常用的jvm参数....
018最新JAVA架构师培训视频教程(附笔记、源码、视频教程 全网盘链接...三、JAVA虚拟机 四、Linux部分 五、数据库设计与优化 六、互联网中间件架构设计 七、互联网框架应用 八、互联网分布式综合项目实战(转载)
Java第三方库 Guava Joda-time Log4j Java 8 容器 Tomcat 1、Java 语言基础和JDK源码阅读 Java 语言基础 编号 名称 1 基本 2 运算符 3 数据类型 4 类 对象 接口 5 数组 6 枚举 7 异常处理 8 注解 9 范型 其他 编号 ...
高级java笔试题 puppet-example 这是一个puppet示范项目,兼作我的运维学习笔记,在现实世界运行着,有...iptables:iptables规则配置工具(第三方开源) java:openjdk keepalived:高可用方案,IP共享(使用VRRP协议
JVM的重要性不言而喻,这个是学习JVM是看视频和读《深入理解JVM》时做的一些笔记,用于复习参考。 读书笔记 第2章:java内存模型和内存溢出异常 1.运行时数据区域 1.程序计数器:线程私有 2.java虚拟机栈:线程私有...
java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap, ExtClassLoader,AppClassLoader类加载器也是一个java类,因此类加载器也需要被加载,所以必须有第一个类加载...
即当前类所在路径及其引用的第三方类库的路径,如第四节中的问题6所述)下的类库 加载到内存中。 开发者可以直接使用系统类加载器。 5. 设计模式:(框架中使用,是程序设计的高级思想) 1. 单例模式...