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虚拟机》是Java开发者必读的经典之作,其中第三章主要探讨了Java安全方面的内容。在Java中,安全是一个至关重要的概念,因为Java的设计目标之一就是提供一种可以在不同环境中安全运行的代码机制。本章...
### 学习深入理解Java虚拟机的前几章笔记 #### JVM内存模型 Java虚拟机(JVM)的内存模型主要分为两大类:线程共享区和线程私有区。 ##### 线程共享区 - **堆**:是所有线程共享的内存区域,在这里存放着对象实例...
读书笔记:周志明老师《深入理解Java虚拟机》第三版阅读笔记
第三步,内存空间初始化;第四步,必要的设置。对象的内存布局在 HotSpot 虚拟机中,对象在内存中存储的布局分为三块:对象头、实例数据和对齐填充。对象头包括两部分信息, 一部分用于存储对象自身的运行时数据,如...
总的来说,"深入理解Java虚拟机读书笔记之:第3章 安全(2)"主要涵盖了Java安全体系的核心概念,包括类加载器、权限模型、安全管理器以及相关工具的使用。理解这些内容对于任何希望构建安全、可靠的Java应用程序的...
读书笔记:《深入理解Java虚拟机 Jvm高级特性与最佳实践第三版》阅读笔记
### 深入Java虚拟机知识点总结 #### 第一章 Java体系结构介绍 - **Java体系结构概述**:本章主要介绍了Java体系结构的基本概念及其组成部分。Java体系结构旨在为开发者提供一个统一、高效且跨平台的应用开发环境。...
《JVM:深入理解Java虚拟机》是一本深入解析Java虚拟机工作原理和技术细节的经典书籍。这份学习笔记将涵盖JVM的关键概念、架构以及它如何影响Java程序的性能。我们将探讨以下几个方面: 1. **JVM概述** Java虚拟机...
的第三部分。第四部分对应于原书的第四部分,程序编译与代码优化,不过仅对 Java 的运行期优化,也就是 JIT 时进行的优化进行了总结,编译器优化部分尚未进行深入研究。 阅读方法: 本 repo 的 README.md 从头读到尾...
《深入理解Java虚拟机》是Java开发者们深入探讨Java运行机制的经典之作,作者周志明以其深入浅出的讲解方式,揭示了Java虚拟机(JVM)的工作原理。本资源包含该书第三版的源码分析及学习笔记,旨在帮助读者更透彻地...
### Java虚拟机(JVM)详解 #### 一、Java虚拟机概述与基本概念 Java虚拟机(JVM)是运行Java字节码的虚拟环境,它位于操作...通过对JVM的深入理解,开发者可以更好地优化程序性能,提高应用程序的稳定性和响应速度。
本repository为《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记,因为第一章主要讲的是Java的发展历史,这里就不做笔记,直接从第2章的"Java内存区域与内存溢出异常"讲起。 第二部分 自动内存...
6. **跨平台性**:Java的一个重要特性就是“编写一次,到处运行”(Write Once Run Anywhere, WORA),这得益于Java的运行机制——Java程序被编译成字节码(Bytecode),然后由Java虚拟机(JVM)解释执行。...
它的设计目标是“一次编写,到处运行”(Write Once, Run Anywhere, WORA),通过Java虚拟机(JVM)实现了这一目标,可以在不同操作系统上运行Java程序。 2. **与.NET框架的区别**: - 平台独立性:Java代码编译成...
- `classpath` 环境变量指定了Java虚拟机查找类路径的位置。 5. **J2SE安装路径** - 如果J2SE安装在`C:\J2SE`目录下,那么: - `Java.exe` 的绝对路径为 `C:\J2SE\bin\Java.exe`。 - 系统类库的绝对路径为 `C:...
深入理解java虚拟机:jvm高级特性与最佳实践源码现代操作系统,第 4 版 作者:Andrew S. Tanenbaum, Herbert Bos ** Notes by Henry Cooksley ** 1 介绍 操作系统、外壳、GUI、图形用户界面、内核模式、主管模式、...
作为笔记的作者,被称为“专业第一”,意味着笔记内容会覆盖Java的基础语法、面向对象的深入理解和高级特性。 2. 面向对象编程:在Java中,一切皆为对象,这是Java最重要的编程范式之一。面向对象编程的基本概念...
3. **运行程序**:通过Java虚拟机(`java.exe`)执行编译后的`.class`文件。 #### 注释 - **单行注释**:使用`//`标记。 - **多行注释**:使用`/* */`包裹注释内容。 #### Java编程方向 - **Java SE (J2SE)**:...
- **可移植性**:“一次编写,到处运行”(Write Once Run Anywhere, WORA),使得Java程序可以在任何安装了Java虚拟机(JVM)的平台上运行。 - **高性能**:通过JIT(Just-In-Time)编译器和先进的垃圾回收机制...