![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 85
jinyangjie0
学如逆水行舟,不进则退
展开
-
理解Java虚拟机(十一)垃圾收集器常用参数总结
对虚拟机非稳定的运行参数进行总结。 参数 描述 UseSerialGC 虚拟机运行在Client模式下的默认值,打开此开关后,使用Serial+Serial Old的手机器组合进行内存回收 UseParNewGC 打开此开关之后,使用ParNew+Serial Old的收集器组合进行内存回收,在JDK 9 后不再支持 UseConcMarkSweepGC 打开此开关之后,使用ParNew+CMS+Serial Old的收集器组合进行内存回收。Serial Old收集器将作为CMS收集原创 2022-01-25 21:23:47 · 215 阅读 · 0 评论 -
理解Java虚拟机(十)虚拟机和垃圾收集器的日志
本系列均是周志明老师《深入理解Java虚拟机》第三版的学习笔记。 阅读分析虚拟机和垃圾收集器的日志是处理Java虚拟机内存问题必备的基础技能。 在JDK 9以前,HotSpot并没有提供统一的日志处理框架,虚拟机各个功能模块的日志开关分布在不同的参数上,日志级别、循环 日志大小、输出格式、重定向等设置在不同功能上都要单独解决。 直到JDK 9,这种混乱不堪的局面才终于消失,HotSpot所有功能的日志都收归到了“-Xlog”参数上,这个参数的能力也相应被极大拓展 了 一、日志级别 日志级原创 2022-01-24 22:12:27 · 661 阅读 · 0 评论 -
理解Java虚拟机(九)垃圾收集器的选择权衡
本系列均是周志明老师《深入理解Java虚拟机》第三版的学习笔记。 选择垃圾收集器时,只用一句"必须因地制宜,按需选用",有点敷衍,所以详细介绍如何选择合适的垃圾收集器 一、Epsilon收集器 在G1、Shenandoah或者ZGC这些越来越复杂、越来越先进的垃圾收集器相继出现的同时,也有一 个“反其道而行”的新垃圾收集器出现在JDK 11的特征清单中——Epsilon,这是一款以不能够进行垃圾 收集为“卖点”的垃圾收集器。 传统Java有着内存占用较大,在容器中启动时间长,即时编译需要缓慢原创 2022-01-24 20:47:28 · 368 阅读 · 0 评论 -
理解Java虚拟机(八)低延迟垃圾收集器-ZGC
本系列均是周志明老师《深入理解Java虚拟机》第三版的学习笔记。 一、ZGC概述 ZGC和Shenandoah的目标是高度相似的,都希望在尽可能对吞吐量影响不太大的前提下,实现在任意堆内存大小下都可以把垃圾收集的停顿时间限制在十毫秒以内的低延迟。 ZGC收集器是一款基于Region内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的,以低延迟为首要目标的一款垃圾收集器。 二、ZGC的区域Region ZGC的 Region可以具有大、中、小原创 2022-01-23 21:51:07 · 588 阅读 · 0 评论 -
理解Java虚拟机(七)低延迟垃圾收集器-Shenandoah
本系列均是周志明老师《深入理解Java虚拟机》第三版的学习笔记。 垃圾收集器有三项最重要的指标:内存占用(Footprint)、吞吐量(Throughput)和延迟(Latency),构成一个“不可能三角”。 随着硬件性能提升,内存大小和吞吐量性能也提升。所以延迟成为垃圾收集器最被重视的性能指标。 Shenandoah和ZGC是两款目前仍处于实验状态的收集器,被官方命名为“低延迟垃圾收集器”(Low-Latency Garbage Collector或者Low-Pause-Time Garbag原创 2022-01-23 21:00:50 · 145 阅读 · 0 评论 -
理解Java虚拟机(六)经典垃圾收集器
虽然垃圾收集器的技术在不断进步,但直到现在还没有最好的收集器出现,更加不存在“万能”的收集器,所以我们选择的只是对具体应用最合适的收集器。 一、Serial收集器 Serial收集器是一个单线程工作的收集器,进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束。 Serial收集器是最基础、历史最悠久的收集器,曾经(在JDK 1.3.1之前)是HotSpot虚拟机新生代收集器的唯一选择。 事实上,迄今为止,它依然是HotSpot虚拟机运行在客户端模式下的默认新生代收集器,有着优于其他收原创 2022-01-22 23:28:33 · 452 阅读 · 0 评论 -
理解Java虚拟机(五)HopSpot虚拟机的算法具体实现
Java虚拟机实现垃圾收集算法时,必须对算法的执行效率有严格的考量,才能保证虚拟机高效运行。 一、根节点枚举 所有收集器在根节点枚举这一步骤时都是必须暂停用户线程的。让执行子系统看起来就像被冻结在某个时间点上,不会出现分析过程中,根节点集合的对象引用关系还在不断变化的情况。 而跟节点枚举这个操作是非常耗时的,必须做到高效。 HotSpot 使用一组称为OopMap的数据结构作为优化。一旦类加载动作完成,HotSpot就会把对象内哪些偏移量上是哪些类型的数据计算出来,在即时编译过程中,也会在特原创 2022-01-21 21:44:57 · 1589 阅读 · 1 评论 -
理解Java虚拟机(四)垃圾收集算法
垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)两大类。主流是后者,所以本篇介绍的算法都属于这类。 一、分代收集理论 1)弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。 2)强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以消亡。 由上两个假说推论出的设计原创 2022-01-20 23:36:36 · 383 阅读 · 2 评论 -
理解Java虚拟机(三)如何判断对象已死
对象已死指不可能再被任何途径使用的对象。 垃圾收集器主要关注3个问题:哪些内存需要回收?什么时候回收?如何回收?本篇就是对第一个问题的回答。 一、回收的区域 程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,内存多少根据类结构是已知的,内存分配和回收具备确定性。 Java堆和方法区两个区域不确定性。只有处于运行期间,我们才能知道程序究竟会创建哪些对象,多少个对象,这部分内存的分配和回收是动态的。垃圾收集器所关注的正是这部分内存该如何管理。 二、判断对象已死的算法 2.1 引用计原创 2022-01-19 22:09:36 · 530 阅读 · 1 评论 -
理解Java虚拟机(二)对象分配、布局和访问的全过程
本篇介绍HotSpot虚拟机在Java堆中对象分配、布局和访问的全过程。 一、对象的创建 1.1 为新生对象分配内存 为新生对象分配内存有两种方式:指针碰撞(Bump The Pointer)和空闲列表(Free List)。 1.1.1 指针碰撞 垃圾收集器带空间压缩整理能力时,Java堆内存是规整的,所有被使用过的内存都被放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离。 1.2.2空闲列表 已使用原创 2022-01-17 23:15:00 · 338 阅读 · 0 评论 -
理解JAVA虚拟机(一)内存区域
Java应用运行时内存交给Java虚拟机自动管理,但出现内存泄漏和溢出问题时,如果不了解虚拟机是怎样使用内存的,那排查错误、修正问题将会成为一项异常艰难的工作。下面从概念上介绍Java虚拟机内存的各个区域,讲解这些区域的作用、服务对象以及可能产生的问题,这也是学习内存管理的第一步。原创 2022-01-09 21:42:46 · 529 阅读 · 0 评论