Java虚拟机探秘
探究Java虚拟机内部的结构和实现原理,并学习如何调优。
Forlogen
无论世事如何,你都要成为一个更优秀的人。
展开
-
Java虚拟机 -- 垃圾回收器(下篇)
文章目录1. 引入2. Shenandosh回收器2.1 简介2.2 运行过程2.3 转发指针2.4 效果对比3. ZGC回收器3.1 简介3.2 染色指针3.3 运行过程3.4 效果对比1. 引入垃圾回收器(上篇)中的性能指标中说到,衡量垃圾回收器最重要的三项指标如下所示:内存占用(Footprint)吞吐量(Throughput)停顿时间(Latency),或延迟如上所示,不管是哪一种垃圾回收器,它们都是朝着优化上述的三个指标的方向进行发展。如今硬件技术的发展,内存占用逐渐的没有那么原创 2020-06-27 10:53:22 · 413 阅读 · 0 评论 -
Java虚拟机 -- 垃圾回收器(中篇)
文章目录1. 引入2. G1回收器2.1 概述2.2 如何理解First?2.3 特点2.3.1 并发和并行2.3.2 分代收集2.3.3 分区2.3.4 空间整合2.3.5 可预测的停顿时间3. 垃圾回收过程3.1 年轻代GC3.2 并发标记3.3 混合回收3.4 Full GC4. 相关参数5. 记忆集1. 引入在垃圾回收器(上篇)中介绍了垃圾回收器分类、性能指标,以及其中的几种垃圾回收器,如Serial回收器、Serial Old回收器、ParNew回收器、Parallel Scavenge回原创 2020-06-26 21:58:44 · 1031 阅读 · 0 评论 -
Java虚拟机 -- 垃圾回收器(上篇)
文章目录垃圾回收器1. 分类2. 性能指标2.1 吞吐量2.2 暂停时间3. 概述4. Serial回收器 - 串行回收5. ParNew回收器 - 并行回收6 . Parallel回收器 - 吞吐量优先6.1 概述6.2 相关参数7. CMS回收器7.1 概述![在这里插入图片描述](https://img-blog.csdnimg.cn/20200612214431973.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_原创 2020-06-12 21:45:06 · 252 阅读 · 0 评论 -
Java虚拟机 -- 垃圾回收相关概念 + 引用分析
文章目录1. System.gc()2. 内存溢出和内存泄漏2.1 内存溢出2.2 内存泄漏3. STW4. GC的并发和并行5. 安全点和安全区域5.1 安全点5.2 安全区域6. 引用6.1 强引用6.3 软引用6.3 弱引用6.4 虚引用6.5 终结器引用6.5 终结器引用1. System.gc()默认情况下,如果程序中显式的调用Sysytem.gc()或者Runtime.getRuntime.gc()可能会触发Full GC,垃圾收集器会同时新生代和老年代进行垃圾回收操作,尝试释放被丢弃对原创 2020-06-12 21:42:33 · 329 阅读 · 0 评论 -
Java虚拟机 -- 垃圾回收算法
文章目录1. 概述1.1 什么是垃圾?1.2 为什么要GC?1.3 回收机制2. 标记阶段2.1 引用计数算法2.2 可达性分析算法2.3 GC Roots2.4 对象的finalization机制2.5 判断对象是否可回收2.6 GC Roots溯源3. 清除阶段3.1 标记-清除(Mark-Sweep)算法3.2 复制(Copying)算法3.3 标记-整理(Mark-Cpmpact)算法4. 分代收集算法5. 增量收集算法6. 分区算法![在这里插入图片描述](https://img-blog.csd原创 2020-06-12 21:40:43 · 355 阅读 · 0 评论 -
Java虚拟机 -- StringTable
文章目录1. String 的特性1.1 基本特性1.2 字符串的修改2. 字符串常量池3. String的内存分配4. String基本操作4.1 实例化4.2 拼接5. intern方法5.1 概述5.2. 面试题5.2.1 new String5.2.2 new String("a") + new String("b")5.3 总结6. String去重操作1. String 的特性1.1 基本特性String 类型的数据表现形式是使用" "表示的字符串String声明为final,原创 2020-06-12 21:36:37 · 405 阅读 · 0 评论 -
Java虚拟机 -- 执行引擎
文章目录执行引擎1. 概述2. 编译和执行3. 参数设置4. 即时编译器5. 热点代码即探测方式5.1 调用计数器5.2 回边计数器5.2 回边计数器执行引擎1. 概述虚拟机和物理机两者都具有执行程序的能力,不同之处在于物理机的执行引擎直接建立在处理器、缓存、指令集合操作系统层面;而虚拟机的执行引擎由软件自行实现,因此可以不受物理条件的制约来指定指令集与执行引擎的体系结构,能够执行那些不被硬件直接支持的指令集格式。Java虚拟机的主要任务是负责装载编译期得到的字节码文件,但是字节码以及运行时数据区原创 2020-06-12 21:33:33 · 277 阅读 · 0 评论 -
Java虚拟机 -- 直接内存
文章目录直接内存1. 概述2. 直接缓冲与非直接缓冲2.1 非直接缓冲2.2 直接缓冲3. 直接内存的OOM4.总结直接内存1. 概述JDK8及之后方法区的实现变成了元空间,元空间不再使用JVM内存,而是直接使用系统内存,故称为直接内存。对于元空间来说,它具有如下的特点:元空间不再位于运行时数据区,也不是Java虚拟机规范中定义的区域元空间直接使用系统内存空间访问直接内存的效率更高,读写性能更好元空间的思想来源于Java中的NIO,它通过堆中的DirectByteBuffer操作本地内存。原创 2020-06-12 21:31:49 · 250 阅读 · 0 评论 -
Java虚拟机 -- 对象的实例化、内存布局和访问定位
文章目录1. 对象的实例化1.1 对象的创建2. 创建的步骤2.1 判断对象对应的类是否加载、链接、初始化2.2 为对象分配内存2.3 处理并发安全问题2.4 初始化分配到的空间2.6 执行`init()`进行初始化3. 对象的内存布局4. 对象的访问定位1. 对象的实例化1.1 对象的创建当程序中定义了一个类之后,我们的目的是为了使用它的对象,并通过对象使用类中所提供的方法,因此,在类创建完毕之后,下一步就需要实例化类对象,即创建类对象。用于对象创建的方式主要有如下几种:通过new关键创建原创 2020-06-02 20:25:51 · 347 阅读 · 0 评论 -
Java内存溢出的几种情况
JVM(Java虚拟机)是一个抽象的计算模型。就如同一台真实的机器,它有自己的指令集和执行引擎,可以在运行时操控内存区域。目的是为构建在其上运行的应用程序提供一个运行环境。JVM可以解读指令代码并与底层进行交互:包括操作系统平台和执行指令并管理资源的硬件体系结构。文章目录1. 前言2. 栈内存溢出3. 堆内存溢出1. 前言JVM提供的内存管理机制和自动垃圾回收极大的解放了用户对于内存的管理,大部分情况下不会出现内存泄漏和内存溢出问题。但是基本不会出现并不等于不会出现,所以掌握Java内存模型原..原创 2020-06-01 09:37:07 · 777 阅读 · 1 评论 -
Java虚拟机 - 虚拟机栈和本地方法栈
文章目录运行时数据区1. 内存和线程2. 程序计数器3. 虚拟机栈3.1概念2. 栈内存溢出3.3 存储结构和原理3.4 内部结构4. 局部变量表4.1 变量槽Slot4.2 静态变量 VS局部变量5. 操作数栈3.4.5 栈顶缓存技术6. 动态链接6.1 概念6.2 方法的调用7. 方法返回地址8. 附加信息9. 本地方法栈运行时数据区1. 内存和线程Java的内存布局规定了Java在运行过程中内存的申请、分配、管理的策略,保证了JVM高效稳定的运行。JVM中关于内存的管理主要涉及的就是运行时数据原创 2020-06-01 09:36:02 · 834 阅读 · 1 评论 -
Java虚拟机 -- 运行时数据区之方法区
文章目录方法区1. 概述2. 参数设置3. 内部结构3.1 类型信息3.2 域信息3.3 方法信息3.4 non-final的类变量3.5 例子4. 运行时常量池4.1 常量池4.2 运行时常量池5. 演进过程6. 垃圾收集7. 使用案例方法区1. 概述JVM中的方法区可看作时独立于Java堆的一块内存空间,它存在的目的就是希望和堆分开。方法区具有如下的特点:线程共享在JVM启动时就被创建,在JVM关闭时内存被释放实际的物理内存空间可以是不连续的空间大小可固定,也可动态扩展方法区的大小决原创 2020-06-01 09:30:23 · 279 阅读 · 0 评论 -
Java虚拟机 -- 运行时数据区之堆
文章目录堆1. 概念2. 堆空间划分2.1年轻代和老年代2.2 分代思想3. 对象分配过程4. Minor GC、Major GC和Full GC4.1 新生代GC的触发机制4.2 老年代GC的触发机制4.3 Full GC的触发机制4.4 GC示例5. 内存分配策略5.1 大对象的分配6. TLAB(Thread Local Allocation Buffer)7.堆常用的jvm参数8. 逃逸技术(Escape Analysis)8.1 栈上分配8.2 同步省略8.3 标量替换8.2 同步省略8.3 标量原创 2020-06-01 09:24:14 · 398 阅读 · 0 评论 -
Java虚拟机 -- 类加载子系统
文章目录1. JVM组成2. 类装载子系统2.1 验证2.2 准备2.3 解析2.4 初始化3. 分类3.1 BoostStrapClassLoader3.2 ExtClassLoader3.3 AppClassLoader3.4 特点4.ClassLoader的常用方法5. 获取ClassLoader的方式6. 双亲委派机制6.1 工作原理7. 参考1. JVM组成Java虚拟机可任意运行任何符合规则的字节码文件(.class),它是用户应用程序和操作系统之间的桥梁,负责将程序编译得到的字节码文件转换原创 2020-06-01 09:18:05 · 331 阅读 · 0 评论 -
Java虚拟机 - 内存模型
文章目录Java虚拟机内存模型1. 发展历程2. Java内存区域3. 堆内存的分配机制4. 对象的访问定位方法5. IDEA中设置JVM参数Java虚拟机内存模型1. 发展历程Classic VM:只能使用纯解释器方式执行Java代码Exact VM:准确内存管理HotSpot VM:热点代码探测技术C:\Users\dyliang>java -versionjava version "1.8.0_221"Java(TM) SE Runtime Environment (原创 2020-06-01 09:11:04 · 425 阅读 · 0 评论