3.2 引用计数法
主流的java虚拟机没有选用引用计数算法来管理内存,主要原因是它何难解决对象之间相互引用的问题
3.2.2 可达性分析算法
可作为GC Roots对象的几种
1)虚拟机栈(栈帧中的本地变量表)中引用的对象
2)方法区中类静态属性引用的对象
3)方法区中常量引用的对象
4)本地方法栈中JNI(即一般说的Native方法)引用的对象
3.2.3 再谈引用
jdk1.2之后,java对引用概念进行了扩充,将引用分为强引用,软引用,弱引用,虚引用四种,引用强度逐步减弱
强引用:普遍存在,只要强引用存在,垃圾收集器永远不会回收掉被引用的对象
软引用:描述一些还有用但并非必需的对象,对于软引用关联的对象,在系统将要发生内存溢出之前,将会把这些对象进行回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出异常。在jdk1.2之后,提供了SoftReference类来实现软引用
弱引用:描述非必需对象,无论内存是否足够,都会回收掉只被弱引用关联的对象。WeakReference
虚引用:幽灵引用,幻影引用,设置虚引用关联的唯一目的就是在这个对象被垃圾回收的时候收到一个系统通知。PhantomReference
3.2.5 方法区
方法区是没有垃圾回收的,主要原因是性价比太低
永久代中垃圾回两种:废弃常量,无用的类
无用的类的标准
1)该类所有的实例都已经被回收
2)加载该类的ClassLoader已经被回收
3)该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法
3.3 垃圾收集算法
标记-清除算法:先标记,后回收
缺点:标记和清除的效率都不高;标记清除之后产生大量内存碎片
复制算法:将内存区域分成两部分,每次只使用其中一块,当这块使用完了,就将还存活的对象复制到另一块上面,然后把已使用过的内存空间一次清理掉。
HotSpot虚拟机默认Eden和Survivor大小比例为8:1
标记-整理算法:标记过程跟标记-清除一样,然后让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存。
分代手机算法:新生代--->复制算法
老年代--->标记-清理或者标记--整理
3.4 HotSpot算法实现
1)枚举根节点
可达性分析对执行时间的敏感还体现在GC停顿上,这项工作必须在确保一致性的快照中实现;
一致性: 在整个分析期间整个执行系统看起来被冻结在某个时间节点上,不可以出现分析过程中对象引用关系还在不断的变化的情况,这点不满足的话分析结果就无法得到保证
这个点----Stop the World
2)安全点
安全点的选定是以是否具有让程序长时间执行的特征为标准选定
3)安全区域
安全区域是指在一段代码片段之中,引用关系不会发生变化
3.5 垃圾收集器
1)Serial 收集器
单线程收集器,单cpu或一条收集器去完成垃圾回收,垃圾回收时,必须暂停所有工作线程,直到它收集完成;适用于Client模式下的虚拟机
2)ParNew 收集器
多线程收集器,在Server模式下虚拟机首选的新生代收集器;除了Serial收集器,只有它能与CMS收集器配合工作;-XX:+UseConcMarkSweepGC 默认新生代收集器,也可以使用-XX:+UseParNewGC强制指定
-XX:ParalleGCThreads指定限制垃圾收集的线程数
3)Parallel Scavenge收集器
新生代收集器,使用复制算法,多线程,主要是达到一个可控制的吞吐量
-XX:MaxGCPauseMills 控制最大垃圾收集停顿时间
-XX:GCTimeRatio 直接设置吞吐量大小
-XX:UseAdaptiveSizePolicy 开关参数,打开之后就不需要指定新生代和老年代比例,晋升老年代对象大小等参数,GC的自适应调接策略
4) CMS收集器
获取最短回收停顿时间为目标的收集器,基于标记-清除算法,过程分为4个步骤
初始标记
并发标记
重新标记
并发清除
缺点:
1)CMS收集器对cpu非常敏感,默认回收线程数=(cpu数量+3)/4
2)CMS收集器无法处理浮动垃圾
3)碎片太多
-XX:UseCMSCompactAtFullCollection 默认开启,用于在CMS收集器顶不住FullGC时开启碎片整理的合并整理过程。
-XX:CMSFullGCsBeforeCompaction 默认0 设置执行多少次不压缩的FullGC后,执行一次带压缩的
5)G1收集器
面向服务器端应用的垃圾收集器,优点: 并行与并发;分代收集;空间整合;可预测的停顿;
收集时将java堆分成多个大小相等的独立区域Region,虽然仍有新生代和老年代的概念,但是新生代和老年代不再是物理隔离,而是一部分Region的集合。
3.6 内存分配与回收策略
对象优先在Eden分配
大对象直接进入老年代 -XX:PretenureSizeThreshold设置大对象大小
长期存活的对象将进入老年代-XX:MaxTenuringThreshold设置年龄大小
动态对象年龄判定
空间分配担保
相关推荐
深入理解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内存区域与内存溢出异常"讲起。 第二部分 自动内存...
深入理解java虚拟机:jvm高级特性与最佳实践源码现代操作系统,第 4 版 作者:Andrew S. Tanenbaum, Herbert Bos ** Notes by Henry Cooksley ** 1 介绍 操作系统、外壳、GUI、图形用户界面、内核模式、主管模式、...
深入理解JVM&G1GC Java并发编程的艺术 java并发编程实战pdf及源码 Java虚拟机(第二版) 实战JAVA虚拟机JVM故障诊断与性能优化 HotSpot实战 Java虚拟机精讲 Kubernetes权威指南:从Docker到Kubernetes实践全接触...
Java虚拟机学习笔记 本文将深入探讨 Java 虚拟机(JVM)的内部机理,涵盖运行时数据区域、Java 对象的内存布局、内存溢出等知识点。 2.1 运行时数据区域 JVM 在启动时,会创建一个运行时数据区域(Runtime Data ...
JVM内在结构的图解文档,visio格式 1.编译过程 2.内存结构 3.对象与类的结构 4.类结构信息 5.对象建立过程 6.收集器 7.方法调用 8.垃圾回收 9.JIT 10.指令 11.线程
本资源摘要信息中,我们将详细介绍 Java 语言的基础知识、Java 开发工具、Java 语言的特点、Java 开发步骤、Java 虚拟机、Java 编译器、Java 字节码文件、Java 解释执行器、Java 虚拟机等。 Java 的基础知识: ...
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虚拟机光盘资源Ubin 计划第 2 阶段 - 法定人数 该存储库包含 Project Ubin Phase 2 中 Quorum 原型的源代码和测试脚本。 Ubin Phase 2 是一个协作设计和快速原型设计项目,探索使用分布式账本技术 (DLT) ...
Notebook 欢迎你来到我的笔记本 本github中写的都是笔记记录,其中内容大部分来源于网上优秀博文或者经典书籍,因此不推荐阅读我的笔记,只是我个人使用为主...第3章:抽象队列同步器 第4章:并发与集合总结 第5章:Has
Java语言的发展史可以分为三个阶段:第一代、第二代和第三代。每个阶段都有其特点和贡献。 四、Java语言的特点 Java语言有多种特点,包括简单性、多线程、面向对象、可移植性等。Java语言的简单性体现在它的语法...
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 范型 其他 编号 ...
语言相关的API,第三方库和计算机基础理论等知识的学习和整理 更多 : | | 目录 资源 详细目录 Java语言和JDK源码 Java语言的基础理论知识 并发编程 Java并发编程相关的内容,并发包源码分析等 集合框架 Java集合框架...
JVM的重要性不言而喻,这个是学习JVM是看视频和读《深入理解JVM》时做的一些笔记,用于复习参考。 读书笔记 第2章:java内存模型和内存溢出异常 1.运行时数据区域 1.程序计数器:线程私有 2.java虚拟机栈:线程私有...
java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap, ExtClassLoader,AppClassLoader类加载器也是一个java类,因此类加载器也需要被加载,所以必须有第一个类加载...