JVM学习笔记
文章平均质量分 92
7rulyL1ar
绵薄之力
展开
-
JVM学习笔记(十)———类加载机制
类加载机制JVM把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。类加载过程中,Java的类型加载、连接和初始化过程都是在程序运行期间完成的,这种策略让Java进行提前编译会面临额外的困难,也会增加类加载的性能开销,但却为Java应用提供了极高的扩展性和灵活性,Java可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。类加载的时机一个类型从被加载到虚拟机内存到卸载初内存,生命原创 2021-11-24 19:41:25 · 643 阅读 · 0 评论 -
JVM学习笔记(十一)———Java类加载器详解
本文主要介绍了类的加载机制和类加载器,通过流程图展示类的加载过程和类加载的详细流程,对其中的一些概念性名词进行了解释;介绍分析了双亲委派机制;通过分析源码填补文字描述中存疑的点,并通过源码展示双亲委派机制底层是如何实现的;展示了如何自定义类加载器,如何用自定义类加载器打破双亲委派机制。原创 2021-08-04 23:47:30 · 696 阅读 · 1 评论 -
JVM学习笔记(九)———Shenandoah垃圾收集器
低延迟垃圾收集器低延迟垃圾收集器,即将最小停顿时间作为主要目标的垃圾收集器。本文主要介绍Shenandoah收集器。衡量垃圾收集器的指标衡量垃圾收集器的三项重要指标是:内存占用、吞吐量和延迟,三者构成了一个不可能三角,即三者的总体表现会随着软硬件技术的进步而提升,但三个方面几乎不可能同时达到完美,一款优秀的收集器通常最多可同时做好其中两项。随计算机硬件的发展和性能的提升,我们越来越能容忍垃圾收集器多占用一些内存,同时硬件性能的提升对软件的处理能力有直接助益,硬件的规格和性能的提高有助于降低收集器运行原创 2021-10-13 00:14:09 · 863 阅读 · 0 评论 -
JVM学习笔记(八)———经典垃圾收集器(2)
经典垃圾收集器(本篇只包含CMS和G1收集器,其他收集器参考上一篇)CMS收集器G1收集器参考书籍 《深入理解Java虚拟机》第三版 ——周志明本篇内容主要用于作者自身学习总结记录,才疏学浅,如文中出现纰漏,还望指正...原创 2021-10-07 22:40:42 · 123 阅读 · 0 评论 -
JVM学习笔记(七)———经典垃圾收集器(1)
经典垃圾收集器(本篇不包含CMS和G1收集器,第二篇链接(待更))经典垃圾收集器指的是已经经历过大量实践,足够程数,目前可以在商用生产环境下放心使用的垃圾收集器,各垃圾收集器关系如下图注:图中上半部分是针对新生代的垃圾收集器,下半部分是针对老年代的垃圾处理器,G1特殊不使用传统意义上的分代思想。连线表示线段两端的垃圾收集器可以搭配使用,其中星标连线代表只有JDK9及后续版本,现段两端的垃圾收集器才可以搭配使用。接下来将逐一介绍这七款垃圾收集器的特点与思路,开始之前应先明确,当前条件下的垃圾收集原创 2021-10-07 00:25:48 · 171 阅读 · 0 评论 -
JVM学习笔记(四)———垃圾收集概述与对象存亡判定
垃圾收集概述与对象存亡判定什么是垃圾收集垃圾收集主要在哪个内存区域发生?判断哪些对象存亡的算法引用计数算法可达性分析算法什么是引用(reference)对象被回收前的自我拯救回收方法区什么是垃圾收集垃圾收集(Garbage Collection) 简称GC,在Java程序运行过程中,会出现许多在为对象分配内存后却不再使用的情况,释放这部分对象所占用的空间后以便为其他对象分配空间的过程就是垃圾收集。想要进行垃圾收集,一定避不开如下三个问题哪些内存需要回收?(即判断哪些对象已经不会再被使用)什么时候回原创 2021-10-04 01:10:57 · 153 阅读 · 0 评论 -
JVM学习笔记(五)———垃圾收集算法
垃圾收集算法从判定对象存亡的角度看,垃圾收集算法分为“引用收集式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC),分别对应引用计数算法和可达性分析算法,本文主要讨论追踪式垃圾收集相关算法的思想。分代收集理论要讨论垃圾收集算法,就一定避不开分代收集理论,当下商业虚拟机的垃圾收集器大都遵循了分代收集(Generational Collection)理论,分代收集理论建立在两个分代假说之上,即弱分代假说:绝大多数对象都是朝生夕灭的。强分代假说:熬过越原创 2021-10-04 23:21:51 · 150 阅读 · 0 评论 -
JVM学习笔记(三)———虚拟机对象
对象的创建对象创建分为以下几个步骤1)当JVM遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用(由于不知道所引用类的具体位置,符号引用以一组符号来描述所引用的目标,例如org.xxx.xxx类这种形式),并检查这个符号引用代表的类是否已经被加载、解析和初始化过。2)如果没有,则先执行对这个类的类加载过程(可以参考类加载机制)。3)类加载检查通过后,接下来虚拟机将为新生对象分配内存,内存大小在类加载完成后便已经确定,为对象分配空间的任务相当于将对象所需的空间原创 2021-10-03 22:21:52 · 126 阅读 · 0 评论 -
JVM学习笔记(一)———JVM运行时数据区域
运行时数据区域JVM在执行JAVA程序的过程中会将由JVM管理的内存区域划分为若干个不同的数据区域。各区域的用途、创建时间和销毁时间不尽相同。运行时数据区域结构如下图所示程序计数器什么是程序计数器?程序计数器是一个记录着当前线程所执行的字节码的行号指示器。程序计数器的功能JAVA程序代码编译后的字节码在即时编译前,其执行方式是通过字节码解释器进行解释执行,而字节码解释器工作时就是通过改变程序计数器的值来轩取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处理和线程恢原创 2021-10-02 22:30:05 · 171 阅读 · 0 评论 -
JVM学习笔记(二)———虚拟机栈
什么是Java虚拟机栈虚拟机栈(Virtual Machine Stack),随着每个线程的创建而创建,主要用于存储栈帧(Stack Frame),而栈帧对应着Java应用程序中一个个被调用的方法。虚拟机栈的作用基本等价于栈帧的作用,用于存储方法的局部变量表、操作数栈、动态连接、方法返回地址等信息,主管Java程序中的方法执行。虚拟机栈的生命周期生命周期与所属线程相同,虚拟机栈是线程私有的内存区域。异常抛出情况当线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowErro原创 2021-10-03 15:35:04 · 171 阅读 · 0 评论 -
JVM学习笔记(六)———对象存活判定与垃圾收集算法的实现细节
根节点枚举迄今为止,所有垃圾收集器在根节点枚举上都必须要暂停用户线程,问题同前文中提到的在整理内存碎片。在根节点枚举时,算法必须在一个能保证一致性快照中才能得以进行,通俗讲就是要保证在枚举的过程中,不允许对象的引用关系还在不断变化,因为这样才能保证验证结果的准确性。由于目前的主流JVM使用的都是准确式垃圾收集器(指使用准确式内存管理的垃圾收集器,即使用此管理的虚拟机可以知道内存中某个位置的数据具体是什么类型),所以当用户线程停顿时,不需要一个不漏的检查完执行上下文和全局的引用位置,虚拟机有办法直接知道原创 2021-10-06 11:24:25 · 117 阅读 · 0 评论