![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
深入理解JVM
文章平均质量分 88
Open_Coder
这个作者很懒,什么都没留下…
展开
-
28-虚拟机性能监控&故障处理工具
欢迎关注公众号 OpenCoder,来和我做朋友吧~经过前面对于虚拟机内存分配与回收技术各方面的介绍, 相信大家已经建立了一个比较系统、 完整的理论基础。 理论总是作为指导实践的工具, 把这些知识应用到实际工作中才是我们的最终目的。 接下来的内容, 我们将从实践的角度去认识虚拟机内存管理的世界。给一个系统定位问题的时候, 知识、 经验是关键基础, 数据是依据, 工具是运用知识处理数据的手段。 这里说的数据包括但不限于异常堆栈、 虚拟机运行日志、 垃圾收集器日志、 线程快照(threaddump/ja.原创 2021-10-28 02:25:17 · 251 阅读 · 0 评论 -
27-YongGC、MinorGC、 Major GC、FullGC傻傻分不清
YongGC、MinorGC、 Major GC、FullGC傻傻分不清今天穿插一篇特别说明篇,有些同学在问YongGC、MinorGC、MajorGC以及Old GC、Full GC这么多名词到底谁是谁?搞晕了!本篇文章特别说明下这里我们把一些名词拿来给大家补充说明下,比如MinorGC 、YongGC、Full GC、OldGC、Major GC、Mixed GC,可能每个人在说的时候都有点混淆和模糊怎么有这么多词呢?到底哪个代表的是新生代、老年代?这次名词其实在业内并没有一个统一的标准和定原创 2021-10-13 23:29:31 · 398 阅读 · 0 评论 -
26-JVM优化到底优化什么?
通过前两个系列我们把JVM相关的一些原理内容并结合一些案例和GC工作原理给大家都介绍清楚了,那么本系列开始重点给大家带来JVM优化相关内容和实战。基于JVM系统运行的过程剖析首先我们还是通过一步一图的方式,将我们整个系统基于JVM跑起来后所涉及到的一些核心知识进行串联以及总结回顾,这样大家在头脑里先有一个整体的思维过程,加深印象,然后我们再结合一些案例来逐步讲解如何针对一些系统进行优化。①对象进年轻代系统启动后,肯定会创建对象,对象肯定存在我们的JVM内存,而且会分配到年轻代的Eden区中:②年原创 2021-10-12 22:28:29 · 210 阅读 · 0 评论 -
25-【扩展补充】JVM 三色标记 增量更新 原始快照
1 基本算法要找出存活对象,根据可达性分析,从GC Roots开始进行遍历访问,可达的则为存活对象:最终结果:A/D/E/F/G 可达我们把遍历对象图过程中遇到的对象,按“是否访问过”这个条件标记成以下三种颜色:白色:尚未访问过。黑色:本对象已访问过,而且本对象 引用到 的其他对象 也全部访问过了。灰色:本对象已访问过,但是本对象 引用到 的其他对象 尚未全部访问完。全部访问后,会转换为黑色。三色标记遍历过程假设现在有白、灰、黑三个集合(表示当前对象的颜色),其遍历访问过程为:.原创 2021-10-12 22:26:29 · 328 阅读 · 0 评论 -
24-一步一图带你理清G1垃圾回收流程
G1垃圾回收流程G1的垃圾回收流程主要是从新生代回收开始,新生代回收与并发标记再到混合回收,接下来我们就先来说第一个新生代回收。G1 Yong Collection当我们的程序启动刚开始的时候会默认分配新生代5%的空间,这里我们假设分配了8个Region给Eden,1个Region给Survior(只是为了画图方便,实际可能Eden对应了有好几十甚至上百个Region),那么对应的初始内存分配如下:那么当我们的Eden区域装满,还是会触发新生代的GC,那么新生代的GC还是会通过复制算法来进行垃原创 2021-09-25 19:10:21 · 301 阅读 · 0 评论 -
23-一文带你搞懂G1收集器
G1收集器介绍Garbage First(简称G1) 收集器是垃圾收集器技术发展历史上的里程碑式的成果, 它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。早在JDK 7刚刚确立项目目标、 Oracle公司制定的JDK 7 RoadMap里面, G1收集器就被视作JDK 7中HotSpot虚拟机的一项重要进化特征。G1是一款主要面向服务端应用的垃圾收集器。HotSpot开发团队最初赋予它的期望是(在比较长期的) 未来可以替换掉JDK 5中发布的CMS收集器。现在这个期望目标已经实现过原创 2021-09-13 22:58:19 · 172 阅读 · 0 评论 -
22-大厂面试题:Con-current Mode Failure如何导致以及解决
上文我们已经介绍了CMS垃圾收集器的工作原理以及流程,本篇我们接着深入说明CMS垃圾收集器的缺点以及所导致的一些问题应该如何解决。先通过一张完整的图来回顾CMS工作的逻辑:CMS的缺点分析CMS是一款优秀的收集器, 它最主要的优点在名字上已经体现出来:并发收集、 低停顿, 一些官方公开文档里面也称之为“并发低停顿收集器”(Concurrent Low Pause Collector) 。CMS收集器是HotSpot虚拟机追求低停顿的第一次成功尝试, 但是它还远达不到完美的程度, 至少有以下三个明显的缺点原创 2021-09-09 16:54:30 · 197 阅读 · 0 评论 -
21-看懂CMS收集器工作机制
CMS收集器年轻代垃圾回收器机制我们都很清楚了,接下来我们介绍最核心的老年代垃圾回收环节。我们平时在写代码的时候,相信大部分同学几乎都没有考虑过垃圾回收啥的吧?就是不停的疯狂写代码,然后直接上线部署,也不考虑我们写的代码对内存是否有影响,对垃圾回收是否有影响。然后当系统运行起来一段时间后,就发现各种卡顿,频繁触发Full GC。类似的情况有很多,我们不能过于理想化的期待永远没有Full GC,还是要针对老年代的垃圾回收器的工作原理做到心理有数,从而更好的做调优工作。一般老年代我们选择的垃圾回收器就是原创 2021-09-08 00:31:52 · 167 阅读 · 0 评论 -
20-Serial收集器+ParNew收集器
垃圾收集器如果说收集算法是内存回收的方法论, 那垃圾收集器就是内存回收的实践者。《Java虚拟机规范》 中对垃圾收集器应该如何实现并没有做出任何规定, 因此不同的厂商、 不同版本的虚拟机所包含的垃圾收集器都可能会有很大差别, 不同的虚拟机一般也都会提供各种参数供用户根据自己的应用特点和要求组合出各个内存分代所使用的收集器。1.Serial收集器Serial收集器是最基础、 历史最悠久的收集器, 曾经(在JDK 1.3.1之前) 是HotSpot虚拟机新生代收集器的唯一选择。大家只看名字就能够猜到, 这原创 2021-09-06 23:00:32 · 132 阅读 · 0 评论 -
19-案例实战剖析-日处理上亿数据的系统内存分析和优化
1.系统背景这是当时开发中遇到的一个真实场景,也是大部分人在开发项目中有可能会遇到的一些场景,该系统主要是做大数据相关计算分析的,日处理数据量在上亿的规模。这里我们重点针对JVM内存的管理来进行模型分析,数据的来源获取主要是MYSQL数据库以及其他数据源里提取大量的数据,通过加载到JVM内存的过程我们来一起分析出现的问题以及如何优化解决(如下图所示):2.生产环境这是一套分布式运行系统,生产环境部署了多台服务器(每台4核8G配置),每台机器大概每分钟负责执行100次数据提取和计算,每次提取大概1万条原创 2021-08-30 18:47:30 · 159 阅读 · 0 评论 -
18-动态对象年龄判断+空间分配担保规则+老年代回收算法
动态对象年龄判断本文中用到的案例是接着上一篇文章继续的,如果有不清楚同学请先查看上一篇文章为了能更好地适应不同程序的内存状况,HotSpot虚拟机并不是永远要求对象的年龄必须达到- XX:MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到-XX:MaxTenuringThreshold中要求的年龄。我们来看执行后的内存情况:Heapd.原创 2021-08-16 22:25:48 · 440 阅读 · 0 评论 -
17-长期存活的对象将进入老年代
长期存活的对象将进入老年代HotSpot虚拟机中多数收集器都采用了分代收集来管理堆内存, 那内存回收时就必须能决策哪些存活对象应当放在新生代, 哪些存活对象放在老年代中。 为做到这点, 虚拟机给每个对象定义了一个对象年龄(Age) 计数器, 存储在对象头中 。 对象通常在Eden区里诞生, 如果经过第一次Minor GC后仍然存活, 并且能被Survivor容纳的话, 该对象会被移动到Survivor空间中, 并且将其对象年龄设为1岁。 对象在Survivor区中每熬过一次Minor GC, 年龄就增加1原创 2021-08-10 14:36:56 · 416 阅读 · 1 评论 -
16-内存分配与回收策略-对象优先分配Eden+大对象进老年代
1.对象优先在Eden分配大多数情况下, 对象在新生代Eden区中分配。 当Eden区没有足够空间进行分配时, 虚拟机将发起一次Minor GC。HotSpot虚拟机提供了-XX: +PrintGCDetails这个收集器日志参数, 告诉虚拟机在发生垃圾收集行为时打印内存回收日志, 并且在进程退出的时候输出当前的内存各区域分配情况。 在实际的问题排查中, 收集器日志常会打印到文件后通过工具进行分析 。接下来在如下的代码片段testAllocation()方法中 ,我们尝试分配三个2MB大小和一个4MB原创 2021-08-04 18:59:26 · 466 阅读 · 0 评论 -
15-大厂面试题-JVM垃圾回收采用的是什么算法,有什么区别和优劣?
通过之前的学习,我们知道了JVM会通过可达性算法来筛选出哪些对象是可回收的,哪些对象是不可回收的,GCRoots对象是哪些,java的引用类型有哪些以及finlize()方法的作用。同时我们也知道了当一个对象在创建的时候是存放在堆内存中的新生代里的,那么当新生代内存满了后就会触发Minor GC;但是问题是我们如何针对新生代内存进行管理,以及如何进行回收这也是一个值得分析和探讨的问题。这里针对新生代的垃圾回收算法,叫做复制算法复制算法我们先来回顾下之前讲堆内存的结构分配存储在JVM中的Java对原创 2021-08-02 17:05:01 · 147 阅读 · 0 评论 -
14-如何抗住双11一天几十亿的订单量?JVM该如何设置内存?
通过之前相关JVM的基础知识学习我们可以结合一些实际生产案例来进行结合巩固和说明,我们在上线一个生产系统的时候,针对预估的并发压力,到底应该如何合理的给出一个未经过调优的比较合理的初始值。另外我们会分析各种参数在设置的时候有哪些考虑的点,Java堆内存到底需要多大?新生代和老年代的内存分别需要多大?永久代和虚拟机栈分别需要多大?这些我们都会结合案例来一步一步的分析。注意:JVM参数到底该如何设置,一定是根据不同的业务系统具体的一些场景来调整的,不是说有一个通用的配置和模板,照着设就没问题了,这个思路是肯原创 2021-07-27 15:19:42 · 265 阅读 · 0 评论 -
13-方法区的演进以及StringTable的调整
方法区的演进以及StringTable的调整《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于 HotSpotJVM 而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开。所以,方法区看作是一块独立于Java堆的内存空间。方法区主要存放的是『Class』,而堆中主要存放的是『实例化的对象』方法区(Method Area)与Java堆一样,是各个线程共享的内存区域。方法区在JVM启动的原创 2021-07-22 23:34:33 · 215 阅读 · 0 评论 -
12-年轻代和老年代
11-年轻代和老年代存储在JVM中的Java对象可以被划分为两类:➷ 一类是生命周期较短的瞬时对象,这类对象的创建和消亡都非常迅速,生命周期短的,及时回收即可。➷ 另外一类对象的生命周期却非常长,在某些极端的情况下还能够与JVM的生命周期保持一致。Java堆区进一步细分的话,可以划分为年轻代(YoungGen)和老年代(oldGen),其中年轻代又可以划分为Eden空间、Survivor0空间和Survivor1空间(有时也叫做from区、to区)。上面这参数开发中一般不会调:★ Eden:F原创 2021-07-20 22:05:23 · 152 阅读 · 0 评论 -
11-本地方法栈和堆内存
11-本地方法栈和堆内存一.本地方法栈Nativemethodstack(本地方法栈):保存native方法进入区域的地址对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,但不止如此,它还可以做任何它想做的事情。任何本地方法接口都会使用某种本地方法栈。当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java栈。然而当它调用的是本地.原创 2021-07-19 15:37:30 · 703 阅读 · 0 评论 -
10-JVM有哪些内存区域?虚拟机栈面试剖析
10-JVM有哪些内存区域?虚拟机栈面试剖析接下来我们继续深入第二个环节,也就是JVM的内存结构,很多人想到BAT等大厂去面试,但是现在互联网大厂面试几乎都会考核JVM相关知识的积累,所在在了解完了JVM的类加载机制之后,我们有必要一起来学习下JVM的内存区域划分。其实我们通过类的加载过程也能知道,在准备阶段我们的类以及静态变量都会进行空间的分配,JVM在运行我们的代码时,是必须要使用多块内存空间的,不同空间里面存放不同的数据,然后配合我们的代码流程,完整系统的运行起来。一.程序计数器首先我们来看第原创 2021-07-16 16:58:20 · 137 阅读 · 0 评论 -
09-Tomcat源码分析——类加载体系
链接:https://pan.baidu.com/s/1-CWk1PayOwOst-_m8CIFCQ提取码:489y 《配套视频讲解》上一篇:08-阿里面试题:Tomcat容器类加载器设计由于在生产环境中,Tomcat一般部署在Linux系统下,所以本文将以 startup.sh shell脚本为准,对Tomcat的启动进行分析。我们启动Tomcat的命令如下:sh startup.shstartup.sh的脚本代码如下:# Better OS/400 detection: see .原创 2021-07-12 21:40:38 · 116 阅读 · 0 评论 -
08-阿里面试题:Tomcat容器类加载器设计
链接:https://pan.baidu.com/s/1-CWk1PayOwOst-_m8CIFCQ提取码:489y 《配套视频讲解》上一篇:07.类加载器Tomcat这种web容器中的类加载器应该如何设计实现?首先我们来看下Tomcat类加载器的设计结构:那么应用程序类加载器下的都是Tomcat自定义的类加载器,Tomcat为什么要自定义这么多类加载器又分别有什么用呢?我们通过以下图来进行说明:首先Tomcat会通过Common类加载器来加载本地lib包下的核心文件,比如servle.原创 2021-07-09 22:48:07 · 120 阅读 · 0 评论 -
07.类加载器
链接:https://pan.baidu.com/s/1-CWk1PayOwOst-_m8CIFCQ提取码:489y 《配套视频讲解》上一篇:06.JVM的类加载机制(初始化阶段)在明白了整个类从加载到初始化的过程,接下来我们有必要来说下类加载器的概念,因为实现上述过程是必须依靠加载器来实现的。类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段。对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个.原创 2021-07-09 00:13:53 · 171 阅读 · 0 评论 -
06.JVM的类加载机制(初始化阶段)
链接:https://pan.baidu.com/s/1-CWk1PayOwOst-_m8CIFCQ提取码:489y 《配套视频讲解》上一篇:05.JVM的类加载机制(连接阶段:验证、准备、解析)4.4类的初始化通过准备阶段类变量已经赋过一次系统要求的初始零值,而初始化阶段就是在给类变量进行赋值操作。初始化阶段会执行类构造器方法 < clinit > () ,该方法不同于类的构造器(是虚拟机视角下的< init >());该方法不需要定义,是javac编译器自.原创 2021-07-06 15:33:21 · 159 阅读 · 0 评论 -
05.JVM的类加载机制(连接阶段:验证、准备、解析)
链接:https://pan.baidu.com/s/1-CWk1PayOwOst-_m8CIFCQ提取码:489y 《配套视频讲解》上一篇:04.JVM的类加载机制(加载时机+加载阶段)4.3类的连接阶段 连接阶段包括:验证、准备、初始化,对于这三个阶段没有太大的必要去深入研究里面的细节,这里的细节很多很繁琐,对于大部分同学来说重点理解其中的一些核心概念即可。4.3.1验证阶段 验证是连接阶段的第一步,这一阶段的目的是确保Class文件的字节流中包含的信息符合《Java虚 拟机规范》的.原创 2021-07-02 14:24:35 · 369 阅读 · 1 评论 -
04.JVM的类加载机制(加载时机+加载阶段)
4.JVM的类加载机制链接:https://pan.baidu.com/s/1-CWk1PayOwOst-_m8CIFCQ提取码:489y 《配套视频讲解》上一篇:03.Java代码的运行机制类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3原创 2021-06-30 23:45:29 · 167 阅读 · 0 评论 -
03.Java代码的运行机制
链接:https://pan.baidu.com/s/1-CWk1PayOwOst-_m8CIFCQ提取码:489y 《配套视频讲解》我们平时写的Java代码,到底是如何运行起来的?我们都知道,我们平时创建的一个一个类,在本地磁盘中的文件名后缀就是 .java,比如User.java 、Product.java ,这也叫做源代码文件。这些源代码文件必须经历我们的javac工具进行编译后生成 .class 的字节码文件才能被运行。那接着我们就要继续思考了:那这些 .cl.原创 2021-06-29 18:09:03 · 162 阅读 · 0 评论 -
02-虚拟机概念和常用虚拟机
1.JVM虚拟机介绍虚拟机概念:虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量。每个虚拟机都有独立的CMOS、硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作。关键字理解:中文名外文名定义虚拟机Virtual Machine具有完整硬件系统功能的完整计算机系原创 2021-06-29 01:17:48 · 297 阅读 · 0 评论 -
01-为什么要学习JVM?
前言:链接:https://pan.baidu.com/s/1-CWk1PayOwOst-_m8CIFCQ提取码:489y 《配套视频讲解》为什么要学习JVM?面试需要深入的理解Java这门语言。1、我们常用的布尔型 Boolean,我们都知道它有两个值,true 和 false。但你们知道其实在运行时,Java 虚拟机是没有布尔型 Boolean 这种类型的。Boolean 型在虚拟机中使用整型的 1 和 0 表示。2、我们都知道类路径和类名唯一确定一个原创 2021-06-29 01:10:59 · 272 阅读 · 0 评论