JVM

JVM / 2022-12-09

上图展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器。Serial收集器Serial收集器是最基本、发展历史最悠久的收集器。这个收集器是一个单线程的收集器,但它的“单线程”的意义并不仅仅说明它只会使用一

JVM / 2022-12-07

每一种收集器的日志形式都是由它们自身的实现所决定的,换而言之,每个收集器的日志格式都可以不一样。但虚拟机设计者为了方便用户阅读,将各个收集器的日志都维持一定的共性,例如以下两段典型的GC日志:33.125: [GC [DefNew: 3324K->152K(3712K), 0.0025925

JVM / 2021-05-18

HotSpot的算法实现前面从理论上介绍了对象存活判定算法和垃圾收集算法,而在HotSpot虚拟机上实现这些算法时,必须对算法的执行效率有严格的考量,才能保证虚拟机高效运行。枚举根节点从可达性分析中从GC Roots节点找引用链这个操作为例,可作为GC Roots的节点主要在全局性的引用(例如常量或

JVM / 2021-05-17

标记-清除算法算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,它的标记过程其实在前一节讲述对象标记判定时已经介绍过了。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其不足进行改进而得到的。它的主要不足有两个:一个是效率问

JVM / 2021-05-17

概述前面我们介绍了Java内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭;每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的。因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自

JVM / 2021-04-22

运行时数据区Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范(Java SE 7版)》的规定,Java虚拟机

JVM / 2021-04-16

前言前面我们讲到Java类加载机制和 Java类的初始化,了解了Java代码从编译,到加载到虚拟机的基本步骤,接下来我们讲Java对象实例初始化过程,让我们更清楚的了解类的实例化的顺序。类的实例化我们在讲类的初始化的时候,提到类初始化其实就是执行< clinit >()方法,其实,实例化

JVM / 2021-04-15

前言上一篇文章中我们讲到Java类加载机制,我们知道Java类加载需要经过装载、验证,准备,解析,初始化这几个阶段。但是类在什么时候会进行初始化呢?初始化的过程又是怎样的呢?这篇文章我们会简单的梳理一下。类的初始化时机什么时候需要开始类加载的第一个步骤“装载”。虚拟机规范中并没有强行约束,可以交给虚

JVM / 2021-04-13

字节码Java有一个很出名的口号:“Write Once, Run Anywhere”,他是如何实现这句口号的呢,这其中就离不开字节码。Sun公司开发了在不同平台上运行的Java虚拟机JVM,用来执行和载入编译后生成的字节码文件。类加载机制虚拟机把Class文件加载到内存并对数据进行校验,转换解析和