java虚拟机原理
reachwang
这个作者很懒,什么都没留下…
展开
-
内存分配与回收策略
其实Java技术体系中的自动内存管理本质上就是自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。内存的回收我们已经讲过,现在看看内存的分配。内存分配是在堆里面进行的,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中。规则不固定,取决于使用的垃圾收集器组合及相关的参数。接下来我们讲解几条比较普遍的内存分...原创 2019-12-06 22:13:17 · 352 阅读 · 0 评论 -
HotSpot的算法实现
我们知道虚拟机中的对象存活判定算法和垃圾收集算法,但在HotSpot中实现这些算法时,必须对算法的执行效率有严格的考量,才能保证虚拟机高效运行。1. 枚举根节点从可达性分析中从GC Roots节点找引用链这个操作为例,可作为GC Roots的节点主要正在**①全局性的引用(常量或类静态属性)与执行上下文(栈帧中的本地变量表)**中,但有些应用的仅仅方法区就有数百兆,若逐个检查里面的引用,肯定会...原创 2019-12-06 16:22:34 · 367 阅读 · 0 评论 -
早期(编译期)优化
Java语言的“编译期”其实是一段“不确定”的操作过程,它可能包含三类:前端编译器:把*.java文件转变为*.class文件的过程,如Sun的Javac、Eclipse JDT中的增量式编译器(ECJ)。后端运行期编译器(JIT):把字节码转变为机器码,如HotSpot VM的C1、C2编译器。静态提前编译器(AOT):直接把*.java文件编译为本地机器代码的过程,如GNU Compi...原创 2019-11-30 21:22:25 · 318 阅读 · 0 评论 -
JVM中的栈帧结构
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用开始至执行完成的过程,都对应一个栈帧在虚拟机栈里面从入栈到出栈的过程。在编译程序代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈都已经完全确定了,并且写入到方法表的Code属性之中,因此...原创 2019-11-15 23:03:56 · 3818 阅读 · 0 评论 -
Java虚拟机中的方法调用过程
方法调用不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法)。但是Class文件的编译过程不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局的入口地址(相当于直接引用)。这个特性给Java带来了更强大的动态扩展能力,但也使方法调用过程变得复杂,需要在类加载期间,甚至到运行期间才能确定目标方法的直接引用。...原创 2019-11-15 14:41:55 · 909 阅读 · 0 评论 -
JVM中的几种垃圾收集器
先上图,看一下HotSpot虚拟机中的垃圾收集器图中包含了7中作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。接下来就一一介绍。1.Serial收集器这个收集器时一个单线程的收集器,但它地“单线程”的意义并不仅仅是它只会使用一个CPU或者一条线程去完成垃圾收集工作,更重要的是它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。即“Stop The W...原创 2019-10-19 16:03:47 · 162 阅读 · 0 评论 -
Java内存模型
首先要知道为什么会有Java内存模型这个东西。我们知道CPU运算速度是很快的,但是往往一个运算任务的快慢不只是取决于CPU的速度,因为其中还会涉及到CPU与内存的交互,这些I/O操作往往限制了运算速度。所以现代操作系统都引入了一层高速缓存作为内存和CPU之间的桥梁,如下图所示。但是这时候会引入一个新的问题:缓存一致性:每个处理器都有自己的高速缓存,而他们又共享同一主存。所以当多个核心共享利用同一块...原创 2019-10-15 12:05:07 · 175 阅读 · 0 评论 -
HotSpot虚拟机中对象的产生和访问
我们以常用的虚拟机HotSpot和内存区域Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配、布局和访问的全过程。1. 对象的创建虚拟机遇到一条new指令时,首先将去检查这个指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。类加载检查通过后,接下来虚拟机降为新生对象分配内存。对象所...原创 2019-09-05 23:44:59 · 177 阅读 · 0 评论 -
JVM中运行时数据区域(内存结构)
Java虚拟机所管理的内存通常包括以下几个运行时数据区域,如图所示:1.程序计数器程序计数器是一块较小的内存空间,可看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选择下一条需要执行的字节码指令。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。...原创 2019-09-02 19:44:34 · 255 阅读 · 0 评论 -
类加载过程
接下来介绍一下Java虚拟机中类加载的全过程,也就是加载、验证、准备、解析和初始化这5个阶段所执行的具体动作。加载“加载”是“类加载”的一个阶段,两者是有一定区别的。加载阶段,虚拟机需要完成一下3件事:通过一个类的权限定名获取定义此类的二进制字节流。将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这...原创 2019-08-19 19:45:27 · 709 阅读 · 0 评论 -
类加载器
通过类的全限定名来获取描述此类的二进制字节流是在Java虚拟机外部实现的,即可以用户自定义,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块成为“类加载器”。1.类与类加载器对于任意一个类,都需要由加载它的类加载器和这个类本身一同确定其在Java虚拟机中的唯一性,每一个类加载器都拥有一个独立的类名称空间。或者表达的通俗一些:比较两个类是否相等,只有在这两个类是由同一个类加载器...原创 2019-07-11 00:02:28 · 133 阅读 · 0 评论 -
类加载的时机
类的加载类从被加载到虚拟机内存中,到卸载出内存为止,其生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)7个阶段,其中验证、准备、解析3个部分统称为连接(Linking),7个阶段发生顺序如图所示:其中加载、验证、准备、初始...原创 2019-06-30 20:18:07 · 499 阅读 · 0 评论 -
JVM中几种垃圾收集算法
垃圾收集算法就是将内存中已经标记为可以清除的对象进行清除,常见有三种算法,我们一一介绍它们:1.标记—清除算法和名字对应,分为两个阶段,分别为标记和清除:首先标记处所有需要回收的对象,标记完成后统一回收所有被标记的对象。此算法是最基础的收集算法,后两个算法均基于这种思路进行改进。但此算法有两个不足之处:效率问题。标记和清除两个过程的效率都不高空间问题。标记清楚后会产生大量不连续的内存碎片...原创 2019-06-24 19:21:56 · 358 阅读 · 0 评论 -
java对象的“死活”
通常JVM中的垃圾回收是针对于JAVA堆和方法区来说的。尤其是JAVA堆,因为很多对象的分配就是在此区域内,而方法区则存放了已经加载的类信息。那垃圾回收时如何判断堆中一个对象已经“死”了呢,即不会再需要它了呢。通常有两种方法1.引用计数算法通常来讲此算法是给对象添加一个引用计数器,每当有一个地方引用过它,计数器的值就加1;当引用失效时,计数器就减1,任何时刻计数器为0的对象就是不可能再被使用的...原创 2019-06-23 12:54:17 · 148 阅读 · 0 评论