![](https://img-blog.csdnimg.cn/20200531141651925.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
深入理解java虚拟机
以周志明的《深入理解java虚拟机 JVM高级特性与实践》这本书为源头,学习笔记
金栗
这个作者很懒,什么都没留下…
展开
-
JVM学习之路---Class类文件结构
Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储额内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。 根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表。 无符号数属于基本的数据类型,以u1,u2,u4,u8来分别代表.原创 2020-07-15 16:25:35 · 87 阅读 · 0 评论 -
JVM学习之路---内存分配与回收策略
Java中的自动内存管理最终可归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象内存,之前我们以及介绍了虚拟机中垃圾收集器体系及其运作原理,现在探讨一下给对象分配内存的部分。 对象的内存分配,往大方向上讲,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中,分配的规则不是固定的,取决于当前使用的是那种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。 1.对象优先在Eden分配 大多数情况下,对象在原创 2020-06-12 19:58:08 · 95 阅读 · 0 评论 -
JVM学习之路---垃圾收集器
如果说收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现没有任何规定,因此不同厂商、版本的虚拟机的垃圾收集器可能会有很大差别。本文主要讨论的收集器基于Sun HotSpot虚拟机1.6版Update22,这个虚拟机包含的所有收集器如下: 在介绍这些收集器各自特性之前,明确一个观点:虽然我们是对各个收集器进行比较,但并非为了挑选一个最好的收集器出来,没有万能的收集器,我们选择的是对具体应用的最适合的收集器。 1.Serial收集器 历史最悠久的虚拟机,原创 2020-06-09 00:14:43 · 84 阅读 · 0 评论 -
JVM学习之路---垃圾收集算法
1.标记 - 清除算法 最基础的收集算法是“标记 - 清除”算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象,之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思想并对其缺点进行改进得到的。它的主要缺点有两个:一个是效率问题,标记和清除过程的效率都不高;另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃原创 2020-06-07 17:42:26 · 135 阅读 · 0 评论 -
JVM学习之路---引用
在JDK 1.2之前,Java中的引用的定义很传统:如果reference类型中存储的数值代表的是另一块内存的起始地址,就称这块内存代表一个引用。这种定义很纯粹,但是太过狭隘,一个对象在这种定义下只有被引用或没有被引用两种状态,对于如何描述一些“食之无味,弃之可惜”的对象就显得无能为力。我们希望能描述这样一类对象:当内存空间还足够时,则能保留在内存之中;如果内存在进行垃圾收集后还是非常紧张,则可以抛弃这些对象。很多系统的缓存功能都符合这样的应用场景。 在JDK 1.2之后,Java对引用的概念进行了扩充,将原创 2020-06-06 22:51:09 · 63 阅读 · 0 评论 -
JVM学习之路---垃圾收集器算法(根搜索算法)
这个算法的基本思路就是通过一系列的名为“GC Roots”的对象作为起点,从这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(图论中是从GC Roots到这个对象不可达)时,证明此对象时不可用的。如图: 对象objct5,object6,object7虽然互相有关联,但是它们到GC Roots是不可达的,所以它们将会判定为是可回收的对象。 在Java中,可作为GC Roots的对象包括以下几种 虚拟机栈(栈帧中的本地变量表)中引用的对象 方法区中的类静态属性原创 2020-06-06 21:18:42 · 251 阅读 · 0 评论 -
JVM学习之路---垃圾收集器算法(引用计数法)
很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器都为0的对象就是不可能再被使用的。 客观地说,引用计数算法的实现简单,判定效率也很高,大部分情况下它都是一个不错的算法,但是,Java语言中没有选用引用技术算法来管理内存,其中主要的原因是它很难解决对象之间的相互循环引用的问题。 举个例子,对象objA和对象objB都有字段instance,赋值令objA.instance = objB及objB.inst原创 2020-06-05 18:22:39 · 127 阅读 · 0 评论 -
JVM学习之路---OutOfMemoryError(OOM)异常
在Java虚拟机的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OOM异常的可能。 Java堆溢出 Java堆用于储存对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,就会在对象数量达到最大堆的容量限制后产生内存溢出异常。 Java堆内存的OOM异常是实际应用中最常见的内存溢出异常情况。出现Java堆内存溢出时,异常堆栈信息“java.lang.OutOfMemoryError”会跟着进一步提示“Java heao space”。 要原创 2020-06-04 14:04:44 · 215 阅读 · 0 评论 -
JVM学习之路-----对象访问
在Java语言中,对象访问是如何进行的?如下面这句代码: Object obj = new Object() 假设这句代码出现在方法体中,那么“Object obj”这部分语义会将反映到Java栈的本地变量表中,作为一个reference类型数据出现。而"new Object()"这部分的语义将会反映到Java堆中,形成一块存储了Object类型所有实例数据值的结构化内存,根据具体类型以及虚拟机实现的对象内存布局的不同,这块内存长度是不固定的。另外,在Java堆中还必须包含能查找到此对象类型数据(如对象类原创 2020-06-02 16:31:51 · 99 阅读 · 0 评论 -
JVM学习之路-----Java内存区域
1 运行时数据区域 java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁,java虚拟机所管理的内存将会包括以下几个运行时数据区域: 1.1 程序计数器 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器 。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分原创 2020-05-31 23:36:41 · 126 阅读 · 0 评论