![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JVM虚拟机
文章平均质量分 86
JVM虚拟机
程序猿洞晓
不忘初心,方得始终。
展开
-
Java中JIT优化中最重要的逃逸分析
如果同步块所使用的锁对象通过这种分析被证实只能够被一个线程访问,那么JIT编译器在编译这个同步块的时候就会取消对这部分代码的同步。在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。在JIT阶段,如果经过逃逸分析,发现一个对象不会被外界访问的话,那么经过JIT优化,就会把这个对象拆解成若干个其中包含的若干个成员变量来代替。代码中对hollis这个对象进行加锁,但是hollis对象的生命周期只在f()方法中,并不会被其他线程所访问到,所以在JIT编译阶段就会被优化掉。转载 2022-09-20 18:17:33 · 415 阅读 · 0 评论 -
Java的即时编译(Just In Time, JIT)及其优化
Java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块运行的特别频繁时,会把这些代码认定为“热点代码”(Hot Spot Code)。为了提高热点代码的执行效率,在运行时,虚拟机会把这些代码编译成本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(JIT编译器,不是Java虚拟机内必须的部分)。转载 2022-09-20 16:55:24 · 554 阅读 · 1 评论 -
Java虚拟机那些事儿(十三):Java基本命令jps、jinfo、jstat
没事的时候在回顾自己的博客,刚好这段时间朋友在外面面试,根据他的反馈也做了很多了解。JVM对于Java开发人员来说是面试的重中之重,也是最难的,因为内部的东西太多,没有一个系统的学习方案,都是东一块西一块的学习,最终导致这方面的知识都是由记忆碎片拼接,不全面也不系统。之前的十几篇博客都是转载自其他的博客,接下来还会借鉴别人的博客来完善整个Java虚拟机的知识体系。这篇博客让我们一起了解一下jps、jinfo、jstat命令的使用,以及输出数据的理解。本文章借鉴于一下两篇博客:java高分局之jstat原创 2022-03-12 10:22:51 · 654 阅读 · 0 评论 -
Java虚拟机那些事儿(十二):类加载器
类与类加载器判断类是否“相等”任意一个类,都由加载它的类加载器和这个类本身一同确立其在 Java 虚拟机中的唯一性,每一个类加载器,都有一个独立的类名称空间。因此,比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个 Class 文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那么这两个类就必定不相等。这里的“相等”,包括代表类的 Class 对象的 equals() 方法、isInstance() 方法的返回结果,也包括使用 insta转载 2022-03-12 10:22:37 · 92 阅读 · 0 评论 -
Java虚拟机那些事儿(十一):类加载的过程
类加载过程包括 5 个阶段:加载、验证、准备、解析和初始化。加载加载的过程“加载”是“类加载”过程的一个阶段,不能混淆这两个名词。在加载阶段,虚拟机需要完成 3 件事:通过类的全限定名获取该类的二进制字节流。将二进制字节流所代表的静态结构转化为方法区的运行时数据结构。在内存中创建一个代表该类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。获取二进制字节流对于 Class 文件,虚拟机没有指明要从哪里获取、怎样获取。除了直接从编译好的 .class 文件中读转载 2022-03-12 10:22:19 · 106 阅读 · 0 评论 -
Java虚拟机那些事儿(十):类加载的时机
类的生命周期类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括以下 7 个阶段:加载验证准备解析初始化使用卸载验证、准备、解析 3 个阶段统称为连接。加载、验证、准备、初始化和卸载这 5 个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始(注意是“开始”,而不是“进行”或“完成”),而解析阶段则不一定:它在某些情况下可以在初始化后再开始,这是为了支持 Java 语言的运行时绑定。类加载过程中“初始化”开始的时机Java 虚拟机规范没有强制约束类加载转载 2022-03-12 10:22:03 · 104 阅读 · 0 评论 -
Java虚拟机那些事儿(九):类文件结构
JVM 的“无关性”谈论 JVM 的无关性,主要有以下两个:平台无关性:任何操作系统都能运行 Java 代码语言无关性: JVM 能运行除 Java 以外的其他代码Java 源代码首先需要使用 Javac 编译器编译成 .class 文件,然后由 JVM 执行 .class 文件,从而程序开始运行。JVM 只认识 .class 文件,它不关心是何种语言生成了 .class 文件,只要 .class 文件符合 JVM 的规范就能运行。 目前已经有 JRuby、Jython、Scala 等语言能够转载 2022-03-12 10:21:46 · 59 阅读 · 0 评论 -
Java虚拟机那些事儿(八):JVM 性能调优
在高性能硬件上部署程序,目前主要有两种方式:通过 64 位 JDK 来使用大内存;使用若干个 32 位虚拟机建立逻辑集群来利用硬件资源。使用 64 位 JDK 管理大内存堆内存变大后,虽然垃圾收集的频率减少了,但每次垃圾回收的时间变长。 如果堆内存为14 G,那么每次 Full GC 将长达数十秒。如果 Full GC 频繁发生,那么对于一个网站来说是无法忍受的。对于用户交互性强、对停顿时间敏感的系统,可以给 Java 虚拟机分配超大堆的前提是有把握把应用程序的 Full GC 频率控制得足够转载 2022-03-11 16:08:20 · 160 阅读 · 0 评论 -
Java虚拟机那些事儿(七):内存分配与回收策略
对象的内存分配,就是在堆上分配(也可能经过 JIT 编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的 Eden 区上,少数情况下可能直接分配在老年代,分配规则不固定,取决于当前使用的垃圾收集器组合以及相关的参数配置。以下列举几条最普遍的内存分配规则,供大家学习。对象优先在 Eden 分配大多数情况下,对象在新生代 Eden 区中分配。当 Eden 区没有足够空间进行分配时,虚拟机将发起一次 Minor GC。Minor GC vs Major GC/Full GC:Minor G转载 2022-03-11 16:06:29 · 98 阅读 · 0 评论 -
Java虚拟机那些事儿(六):HotSpot垃圾收集器参数和组合方式
HotSpot 虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,也会适用于不同的分代。不同的分代之间也有对应的关联参数。垃圾回收器的回顾垃圾回收算法复制算法标记-清理算法标记-整理算法垃圾回收器SerialSerial OldParNewCMSParallel ScavengeParallel Old理解垃圾回收算法只有三个,但是垃圾回收器有很多。其实垃圾回收器就是对这些算法的包装,然后根据不同的思想进行一定的组合。对单线程和线程进行适配,提高GC的效率,提高用户的原创 2022-03-11 15:56:53 · 820 阅读 · 0 评论 -
Java虚拟机那些事儿(五):HotSpot垃圾收集器
HotSpot 虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,虽然我们要对各个收集器进行比较,但并非为了挑选出一个最好的收集器。我们选择的只是对具体应用最合适的收集器。新生代垃圾收集器Serial 垃圾收集器(单线程)只开启一条 GC 线程进行垃圾回收,并且在垃圾收集过程中停止一切用户线程(Stop The World)。一般客户端应用所需内存较小,不会创建太多对象,而且堆内存不大,因此垃圾收集器回收时间短,即使在这段时间停止一切用户线程,也不会感觉明显卡顿。因此 Serial 垃圾收集器适转载 2022-03-11 15:53:41 · 85 阅读 · 0 评论 -
Java虚拟机那些事儿(四):垃圾收集策略与算法
程序计数器、虚拟机栈、本地方法栈随线程而生,也随线程而灭;栈帧随着方法的开始而入栈,随着方法的结束而出栈。这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而对于 Java 堆和方法区,我们只有在程序运行期间才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器所关注的正是这部分内存。判定对象是否存活若一个对象不被任何对象或变量引用,那么它就是无效对象,需要被回收。引用计数法在对象头维护着一个 coun原创 2022-03-11 15:50:07 · 89 阅读 · 0 评论 -
Java虚拟机那些事儿(三):HotSpot虚拟机对象探秘
对象的内存模型在 HotSpot 虚拟机中,对象的内存布局分为以下 3 块区域:对象头(Header)实例数据(Instance Data)对齐填充(Padding)对象头对象头记录了对象在运行过程中所需要使用的一些数据:哈希码GC 分代年龄锁状态标志线程持有的锁偏向线程 ID偏向时间戳对象头可能包含类型指针,通过该指针能确定对象属于哪个类。如果对象是一个数组,那么对象头还会包括数组长度。对齐填充用于确保对象的总长度为 8 字节的整数倍。HotSpot VM 的自动转载 2022-03-11 15:47:11 · 128 阅读 · 0 评论 -
Java虚拟机那些事儿(二):JVM内存结构
JVM内存结构图Java 虚拟机的内存空间分为 5 个部分:程序计数器Java虚拟机栈本地方法栈堆方法区JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对 JVM 规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。程序计数器(PC 寄存器)程序计数器的定义程序计数器是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址。若当前线程正在执行的是一个本地方法,那么此时转载 2022-03-11 15:21:06 · 113 阅读 · 0 评论 -
Java虚拟机那些事儿(一):浅析JVM与JMM模型结构与关系
最近翻看了java线程相关的东西,书中有一边专门讲到java内存模型,读完之后边回想起java虚拟机模型,那时心中便在思考java内存模型(以下简称JMM)和java虚拟机模型(以下简称JVM)之间的关系,下面将详细讲述。JVM结构JVM的内部结构如下图所示,这张图很清楚形象的描绘了整个JVM的内部结构,以及各个部分之间的交互和作用。Class Loader(类加载器)就是将Class文件加载到内存,再说的详细一点就是,把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化转载 2022-03-11 15:19:38 · 157 阅读 · 0 评论