`

深入理解java虚拟机读书笔记-第三章

    博客分类:
  • JVM
 
阅读更多

==============对象是否生存======================

    引用计数法:

     给对象添加一个引用计数器,每当有一个地方引用它的地方,计数器值+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的对象包括下面几种:

深入理解java虚拟机
虚拟机栈的本地变量表中引用的对象。
方法去中类静态属性引用的对象。
方法区中常量引用的对象。
方法区栈中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虚拟机读书笔记之:第3章 安全(3)

    通过阅读《深入理解Java虚拟机》第三章,开发者不仅可以深入理解Java的安全机制,还能学习到如何在实际项目中实施这些安全策略,提升应用的安全性。对于想要从事Java开发或者对系统安全有深入了解需求的人来说,这一...

    深入理解Java虚拟机读书笔记之:第3章 安全(2)

    总的来说,"深入理解Java虚拟机读书笔记之:第3章 安全(2)"主要涵盖了Java安全体系的核心概念,包括类加载器、权限模型、安全管理器以及相关工具的使用。理解这些内容对于任何希望构建安全、可靠的Java应用程序的...

    深入理解Java虚拟机学习笔记借鉴.pdf

    第三步,内存空间初始化;第四步,必要的设置。对象的内存布局在 HotSpot 虚拟机中,对象在内存中存储的布局分为三块:对象头、实例数据和对齐填充。对象头包括两部分信息, 一部分用于存储对象自身的运行时数据,如...

    学习深入理解Java虚拟机的前几章笔记

    ### 学习深入理解Java虚拟机的前几章笔记 #### JVM内存模型 Java虚拟机(JVM)的内存模型主要分为两大类:线程共享区和线程私有区。 ##### 线程共享区 - **堆**:是所有线程共享的内存区域,在这里存放着对象实例...

    读书笔记:周志明老师《深入理解Java虚拟机》第三版阅读笔记.zip

    读书笔记:周志明老师《深入理解Java虚拟机》第三版阅读笔记

    深入java虚拟机笔记

    ### 深入Java虚拟机知识点总结 #### 第一章 Java体系结构介绍 - **Java体系结构概述**:本章主要介绍了Java体系结构的基本概念及其组成部分。Java体系结构旨在为开发者提供一个统一、高效且跨平台的应用开发环境。...

    读书笔记:《深入理解Java虚拟机 Jvm高级特性与最佳实践第三版》阅读笔记.zip

    读书笔记:《深入理解Java虚拟机 Jvm高级特性与最佳实践第三版》阅读笔记

    JVM:深入理解Java虚拟机 - 学习笔记

    《JVM:深入理解Java虚拟机》是一本深入解析Java虚拟机工作原理和技术细节的经典书籍。这份学习笔记将涵盖JVM的关键概念、架构以及它如何影响Java程序的性能。我们将探讨以下几个方面: 1. **JVM概述** Java虚拟机...

    虚拟机学习笔记--周志明老师第三版

    虚拟机学习笔记 Java 虚拟机(JVM)是 Java 语言的 runtime 环境,负责加载、验证、执行 Java 字节码。以下是 JVM 相关知识点的总结。 1. 运行时数据区域 JVM 的运行时数据区域主要包括: * 堆(Heap):...

    java虚拟机源码学习-UnderstandingTheJVM:深入理解Java虚拟机(周志明)源码及学习笔记

    《深入理解Java虚拟机》是Java开发者们深入探讨Java运行机制的经典之作,作者周志明以其深入浅出的讲解方式,揭示了Java虚拟机(JVM)的工作原理。本资源包含该书第三版的源码分析及学习笔记,旨在帮助读者更透彻地...

    高级java笔试题-understanding-the-jvm:《深入理解Java虚拟机》阅读笔记

    的第三部分。第四部分对应于原书的第四部分,程序编译与代码优化,不过仅对 Java 的运行期优化,也就是 JIT 时进行的优化进行了总结,编译器优化部分尚未进行深入研究。 阅读方法: 本 repo 的 README.md 从头读到尾...

    Java虚拟机讲解笔记.docx

    ### Java虚拟机(JVM)详解 #### 一、Java虚拟机概述与基本概念 Java虚拟机(JVM)是运行Java字节码的虚拟环境,它位于操作...通过对JVM的深入理解,开发者可以更好地优化程序性能,提高应用程序的稳定性和响应速度。

    UnderstandingTheJVM:《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记

    本repository为《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记,因为第一章主要讲的是Java的发展历史,这里就不做笔记,直接从第2章的"Java内存区域与内存溢出异常"讲起。 第二部分 自动内存...

    java学习笔记-----给java初学者

    学习Java的第一步是安装Java Development Kit (JDK),它包含了编译、调试和运行Java程序所需的所有工具,如javac编译器和Java虚拟机(JVM)。 3. **基本语法** - **变量与数据类型**:Java有八种基本数据类型,...

    JAVA学习经典笔记-----2

    6. **高性能:** Java虚拟机(JVM)通过即时编译(JIT)技术提高程序的执行速度。 7. **多线程:** Java内置对多线程的支持,简化了并发程序的开发。 #### 三、Java开发环境配置 1. **Linux环境:** - 配置`JAVA_HOME...

    Java课堂学习笔记-4.26.doc

    【Java学习笔记】 Java是一种广泛使用的面向对象的编程语言,...从安装JDK到编写第一个程序,再到深入理解其语法和面向对象概念,每个步骤都是掌握Java不可或缺的部分。不断学习和实践,才能在Java的世界里游刃有余。

    深入java虚拟机源码-books-recommendation:后端进阶经典图书

    深入理解JVM&G1GC Java并发编程的艺术 java并发编程实战pdf及源码 Java虚拟机(第二版) 实战JAVA虚拟机JVM故障诊断与性能优化 HotSpot实战 Java虚拟机精讲 Kubernetes权威指南:从Docker到Kubernetes实践全接触...

    深入java虚拟机光盘源码-ubin-quorum:哪里在

    深入java虚拟机光盘资源Ubin 计划第 2 阶段 - 法定人数 该存储库包含 Project Ubin Phase 2 中 Quorum 原型的源代码和测试脚本。 Ubin Phase 2 是一个协作设计和快速原型设计项目,探索使用分布式账本技术 (DLT) ...

    JAVA学习笔记-良葛格

    Java语言具有跨平台性(Write Once, Run Anywhere),这是因为它具有JVM(Java虚拟机)的存在。任何操作系统上的JVM都可以运行相同的Java字节码,从而避免了针对不同平台编写不同代码的需要。 Java语言的另一特点是...

    Java文档-jdk-6u10-docs-java类库6.0-高压缩第二部分

    在Java 6.0中,可能包含有关JVM(Java虚拟机)的改进、内存管理、新添加的命令行选项等技术细节。 **四、法律信息** `legal`部分包含了与软件许可、版权和其他法律相关的文件。在使用和分发Java SDK或JRE时,了解...

Global site tag (gtag.js) - Google Analytics