JVM从入门到掌握
文章平均质量分 85
从什么是跨平台开始,到JVM的底层执行原理、虚拟机堆栈详解、minor gc 、full gc垃圾回收详解,对象在jvm中的存储、OOM的调优、以及JVM日志的排查、以及如何写一个JVM。
Think_Higher
内存虽快,但不持久,好记性不如烂笔头。
展开
-
JVM 知识点补充
什么是 ZGC如何选择垃圾收集器Hotspot 为什么使用元空间替换了永久代什么是永久代?它和方法区有什么关系呢?什么是元空间?它和方法区有什么关系呢?为什么使用元空间替换了永久代?为什么使用元空间替换永久代?什么是 Stop The World ? 什么是 OopMap?什么是安全点?原创 2023-03-23 20:38:55 · 585 阅读 · 0 评论 -
Java 即时编译(JIT)原理与优化
跨平台的本质- 翻译为目标机器CPU认识的机器码编译器类别编译器执行过程即时编译即时编译器(JIT)解释器和编译器即时编译器类型客户端编译器(Client Compiler)服务端编译器(Server Compiler)分层编译器(Tiered Compiler)即时编译的触发触发阈值编译器优化技术方法内联逃逸分析逃逸状态:优化手段公共子表达式消除即时编译实战jstat即时编译调优如何选择编译器调优代码缓存编译阈值未启用分层编译启用分层编译异步编译总结原创 2023-03-19 21:27:17 · 316 阅读 · 0 评论 -
你还不知道JVM逃逸分析吗?
逃逸(Escape Analysis)分析是什么?基本原理JVM中是否开启逃逸分析方法逃逸线程逃逸开启逃逸分析,编译器可以对代码进行如下优化1)同步省略(锁消除)2)标量替换3)栈上分配原创 2023-03-19 20:48:17 · 275 阅读 · 0 评论 -
JVM 空间分配担保机制
1、空间分配担保的目的?2、JDK 6 Update 24之前3、在JDK 6 Update 24之后原创 2023-03-19 20:24:55 · 1198 阅读 · 0 评论 -
面试官:讲讲G1收集器,就你知道的尽可能都讲一下
传统垃圾收集器的瓶颈Parallel Scavenge + Parallel Old 组合CMS + ParNew 组合为什么Parallel Scavenge不能cms一起使用G1垃圾收集器G1的目标基于Region的堆内存布局RSet解决跨Region引用标记阶段如何实现GC线程与用户线程并行SATB(Snapshot At The Beginning)维护被删除的旧引用TAMS(top-at-mark-start)指针来记录新分配的对象G1垃圾回收的运作流程全局并发标记(glo原创 2023-03-19 17:45:52 · 228 阅读 · 0 评论 -
JVM 中到底什么是STW - STOP THE WORLD?发生了什么?
STW什么是 Oop什么是 OopMapOopMap 使用如何暂停线程安全点STW的真面目原创 2023-03-19 16:51:00 · 219 阅读 · 0 评论 -
保守式 GC、半保守式 GC、和准确式 GC
可达性分析保守式 GC半保守式GC准确式 GC安全点分代收集标记-清除标记-复制标记-整理跨代引用增量式 GC三色标记算法原创 2023-03-19 16:40:47 · 127 阅读 · 0 评论 -
JVM经典面试问题
1.说说 JVM 内存区域1.程序计数器2.虚拟机栈3.本地方法栈4.堆5.方法区6.直接内存3.GC Roots 有哪些?固定的GC Roots临时GC Roots:4.java 有哪四种引用类型?5.说一说分代收集理论6.垃圾收集算法有哪些?1.标记清除算法2.标记复制算法3.标记整理算法7.什么是 STW ?8.为什么需要 STW?9.垃圾回收器是怎样寻找 GC Roots 的?10.OopMap 是做什么的?有什么好处?11.什么是安全点?12.安全区域是什原创 2023-03-18 22:04:01 · 79 阅读 · 0 评论 -
JVM 堆 以及 方法区的可达性分析
可达性分析法什么是GC Roots哪些对象可以作为GC Roots全局对象执行上下文对象不可达的对象一定会回收吗?(缓刑阶段)第一次标记第二次标记方法区的回收原创 2023-03-18 21:02:54 · 489 阅读 · 0 评论 -
JVM CMS的缺点和问题
缺点1、浮动垃圾2、空间碎片解决方案为什么CMS不使用标记整理,而采用标记清楚关于时间开销:3、对CPU资源敏感问题1、promotion failed2、concurrent mode failure解决方案原创 2023-03-18 20:48:25 · 579 阅读 · 0 评论 -
面试官 : G1垃圾回收器你了解过吗?为什么CMS收集器停顿时间短?
为什么CMS 垃圾收集器停顿时间短?G1垃圾收集器G1的工作流程Minor GC的回收过程Mixed GC的回收过程引用变更Full GC触发时机原创 2023-03-18 20:33:12 · 459 阅读 · 0 评论 -
因JVM OOM而进行JVM 垃圾回收器调优更换的一次案例 -ParallelGC和ConcMarkSweepGC
因JVM OOM而进行JVM 垃圾回收器调优更换的一次案例 -ParallelGC和ConcMarkSweepGC原创 2022-11-02 15:57:19 · 318 阅读 · 0 评论 -
Java WeakReference (弱引用)和SoftReference(软引用)的区别
在Java垃圾收集机制中,有四种类型的引用:Strong References 强引用Weak References 弱引用Soft References 软引用Phantom References 虚引用强引用 Strong References这是默认Objec类型/类的引用类型,拥有一个强引用的任何对象,都没有资格被当成垃圾回收。对象被垃圾收集,只有当强引用的变量指向空引用。MyClass obj = new MyClass();弱引用 Weak References使用它原创 2022-03-24 22:50:57 · 693 阅读 · 0 评论 -
JVM 虚拟机知识点总结归纳
Java 虚拟机Java 虚拟机一、运行时数据区域程序计数器Java 虚拟机栈本地方法栈堆方法区运行时常量池直接内存二、垃圾收集判断一个对象是否可被回收引用类型垃圾收集算法垃圾收集器三、内存分配与回收策略Minor GC 和 Full GC内存分配策略Full GC 的触发条件四、类加载机制类的生命周期类加载过程类初始化时机类与类加载器类加载器分类双亲委派模型自定义类加载器实现参考资料本文大部分内容参考 周志明原创 2022-01-18 21:36:00 · 118 阅读 · 0 评论 -
JAVA内存管理 之 内存泄漏
什么是内存泄漏定义:内存泄漏(memoryleak),是指程序申请内存后,当该内存不再需要,但无法被释放的现象。影响:容易造成应用发生内存溢出(OOM-OutOfMemory),致使应用闪退。本质:生命周期较长的对象持有生命周期较短的对象的引用。疑问:1、如何知道申请的内存对象不再需要,不再需要的内存对象又是如何进行回收的。2、内存溢出和内存泄漏的关系3、有哪些常见的内存泄漏问题,如何分析定位内存泄漏内存如何回收JVM内存模型内存泄漏主要发生在堆区。对象回收判断对象是否可以回原创 2021-02-22 14:12:12 · 200 阅读 · 0 评论 -
JVM g1 部分参数
g1 部分参数配置项意义-XX:CICompilerCount=3JVM最大并行编译线程数-XX:ConcGCThreads=1GC并发阶段使用的线程数-XX:+DisableExplicitGC禁止代码中显示调用GC-XX:G1HeapRegionSize=8388608单位byte,此处是8M,设置的 G1 区域的大小。值是 2 的幂,范围是 1 MB 到 32 MB 之间。目标是根据最小的 Java 堆大小划分出约 2048 个区域。每个Region的状原创 2020-11-18 20:44:40 · 1273 阅读 · 0 评论 -
Arthas(阿尔萨斯)- 阿里开源的Java在线诊断工具(火焰图-实战篇--spring copyproperties方法)
profiler/火焰图火焰图是基于 perf 结果产生的 SVG 图片,用来展示 CPU 的调用栈。y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。火焰图就是看顶层的哪...原创 2020-04-17 15:16:53 · 1657 阅读 · 0 评论 -
Arthas(阿尔萨斯)- 阿里开源的Java在线诊断工具(火焰图-实战篇--string format方法)
火焰图观察发现string的 format方法的采样占比占了整个采样占比的6%+原因发现了吧,就是每次请求都会执行这个方法。然后正则的匹配一般偶比较的耗时。优化代码优化,方向就是尽量少使用复杂的正则使用stringbuilder配合省略号代替多参数的,进行封装下即可。类似这样 ...原创 2020-04-18 17:15:15 · 678 阅读 · 0 评论 -
Arthas(阿尔萨斯)- 阿里开源的Java在线诊断工具(火焰图-实战篇--正则表达式 优化方法)
背景目前分析因为耗时主要耗在compile编译阶段这个阶段,在外面还是一个通过乐观锁进行竞争的,根据matcher的matcher方法 private void compile() { // Handle canonical equivalences if (has(CANON_EQ) && !has(LITERAL)) { ...原创 2020-04-20 11:54:12 · 645 阅读 · 0 评论 -
Arthas(阿尔萨斯)- 阿里开源的Java在线诊断工具(理论篇)
Arthas 是什么?Arthas 是 阿里在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6+, 采用命令行交互模式,提供 Tab 自动补全,可以方便地定位和诊断线上程序运行问题。当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没 commit?分...原创 2020-04-17 14:26:37 · 976 阅读 · 0 评论 -
OOM与调优的思路
文章目录哪些区域会OOM堆区栈区元空间(方法区)本地方法栈调优思路调优的阶段上线前、预估调优上线初期、基于日志简单调优OOM 、频繁full gc调优参数布尔类型逃逸分析key-value 类型缩写案例分析如何调优哪些区域会OOM堆区通过下面代码模拟下OOM栈区元空间(方法区)模拟元空间OOM,主要是通过CGLIB模拟,不停向元空间创建Klass(并不是写错了,而是c++里面Java对应的oop的类信息,JVM是源码都是c和c++)本地方法栈也会,但是这里不涉及调优思路调优的阶段原创 2020-10-18 21:49:01 · 340 阅读 · 0 评论 -
JVM中的String类型对象以及常量池
文章目录String类型对象常量池静态常量池和动态常量池的关系以及区别字符串常量池(string pool):String类型对象String str = "abc";在JVM 中创建了几个string对象?通过打开idea 的debug,中的memory。发现char[]和string 各创建了一个。所以,在JVM中创建了1个string 对象(在方法区的常量池中创建了一个字符串对象。),两个oop对象(c++中对应的对象,一个是string对象对应的oop,一个是数组对应的oop)。St原创 2020-10-18 19:51:39 · 177 阅读 · 0 评论 -
JVM 中对象的内存布局以及如何计算对象和数组的大小
继续上一文章的我们来谈谈minor gc 与full gc文章目录Minor gcMinor gc原创 2020-10-18 19:41:38 · 230 阅读 · 1 评论 -
本地方法栈、元空间、堆
文章目录本地方法栈元空间对象和类的关系堆新生代模拟 OOM本地方法栈比如,Thread.sleep()线程休眠方法我们上一篇文章中说过,一个方法就是一个栈帧。但是sleep这个方法比较特殊,使用native修饰的。这意味着什么呢?意味着,这个方法底层是使用c或c++实现的,而不是Java。需要通过JNI(Java native interface) 去调用c和c++的代码。对于这种情况,Java就会单独拎出一个空间,叫本地方法栈。专门去处理用native关键字修饰过的方法。它底层的逻辑和虚拟原创 2020-10-17 12:11:32 · 250 阅读 · 0 评论 -
JVM底层执行原理
接着上次的图上面的app.class 字节码文件是如何加载到JVM运行数据区中呢?大家应该听说过 双亲委派机制吧,其中classloader的工作就干了这个事情。JVM 运行数据区从线程的角度,JVM 运行数据区可以分为线程共享和线程私有。其中堆和元空间,存在的数据时共享的,那么并发的问题就会在这这两个区域发生。而线程私有区域是不会发生。线程上面 图中的执行引擎会分配一个线程会执行下面的代码。这里是 main ,主线程主线程就会分配到3块线程私有的空间。栈一种数据结构,用来存储原创 2020-10-14 22:55:57 · 240 阅读 · 1 评论 -
JVM虚拟机开发中的作用
跨平台入门日常我们coding的时候,通常是下面这样的所有的java代码都运行在虚拟机上,所以可以跨平台,windows,linux上。因为linux和window底层的机器码有差异,需要我们jvm来做跨平台。平时说的跨平台,也指的是JVM跨平台。而不是代码跨平台。Java虚拟机从软件层面屏蔽了底层硬件指令层面的细节。那C 和C ++ 是跨平台的吗?答案是是的。redis是c c++开发的,既能在linux上运行,也能够在windows上运行,所以是跨平台的。举个例子,来告诉你 C 和C原创 2020-10-09 22:48:46 · 187 阅读 · 0 评论 -
线上服务启动卡死,堆栈分析
背景服务启动时候会从mysql加载数据到es中,测试环境正常,线上异常卡住,不动。查看堆栈信息关键点"elasticsearch[_client_][generic][T#5]" #843 daemon prio=5 os_prio=0 tid=0x00007fb3ec007000 nid=0x601b waiting on condition [0x00007fb1b5596000] java.lang.Thread.State: TIMED_WAITING (parking)原创 2020-06-19 18:12:43 · 1024 阅读 · 0 评论 -
JVM 垃圾回收器 ZGC
JAVA内存模型JVM线程OSThreadJVM 对不同系统的线程抽象ThreadThread 是 C++ 定义的线程基类,除了 OSThread 类,作为其他线程的基类,它包含了 OSThread 对象的指针JavaThread:Java 层创建的线程CompilerThread :C1 CompilerThread 和C2 CompilerThreadVMThread:单例原生线程VMThread维护一个vm操作队列(VMOperationQueue):GC,heapdump原创 2020-05-28 18:06:39 · 297 阅读 · 0 评论 -
JVM系列(一)—— 何为JVM
JVM能够跨计算机系结构来执行JAVA字节码,主要是由于JVM屏蔽了与各个计算机平台相关的软件或硬件之间的差异,使得与平台相关的耦合统一由JVM提供者来实现。JVM的全称是Java Virtual Machine(Java虚拟机),它通过模拟一个计算机来达到一个计算机所具有的计算功能。我们先来看看一个真实的计算机如何才能具备计算的功能。指令集,这个计算机所能识别的机器语言的命令集合。计...原创 2018-05-02 22:55:11 · 532 阅读 · 0 评论 -
如何实现自己的ClassLoader
ClassLoader能够完成的事情无非有以下几种情况:在自定义路径下查找自定义的class类文件,也许我们需要的class文件并不总是已经设置好的classpath下,那么我摸嗯必须想办法来找到这个类,在这种情况下,我们需要自己实现一个ClassLoader对我们自己的要加载的类做特殊处理,如保证通过网络传输的类的安全性,可以将类经过加密后再传输,在加载到JVM之前需要对类的字节码再解密...原创 2018-04-22 22:31:20 · 2128 阅读 · 0 评论 -
常用的ClassLoader分析
我们创建一个简单的Web应用,里面只有一个HelloWorldServlet,然后在这个Servlet中打印加载它的ClassLoader,代码如下:import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServle...原创 2018-04-22 12:15:19 · 266 阅读 · 0 评论 -
常见加载类错误分析
在执行 Java程序时经常会碰到ClassNotFoundException和NoClassDefFoundError两个异常,它们都和类加载有关,下面详细分一下这两个异常的原因。ClassNotFoundExceptionClassNotFoundException恐怕时Java程序员经常碰到的异常,尤其是初学者来说,简直是让人崩溃,明明那个类就在那里,为啥就是找不到呢?无数个Jav...原创 2018-04-21 23:21:19 · 1066 阅读 · 0 评论 -
如何加载Class文件到JVM
如下图所示,是ClassLoader加载一个class文件到JVM时需要经过的步骤: 第一阶段是找到.class文件并把这个文件包含的字节码加载到内存中。 第二阶段又可以分为三个步骤,分别是字节码验证、Class类数据结构分析及相应的内存分配和最后的符号表的链接。 第三阶段是类中静态属性和初始化赋值,以及静态块的执行。加载字节码到内存其实在抽象类ClassLoader中并没有定义...原创 2018-04-18 20:54:14 · 2270 阅读 · 0 评论 -
ClassLoader工作机制
classLoader顾名思义就是类加载器。 负责将类加载到JVM中,它就好比开会时门口的接待员,负责给进入会场的嘉宾发放入证明,入会的嘉宾分为VIP会员,黄金会员,白金会员,和普通会员等。都赢的接待室也会分为VIP会员接待室,黄金会员接待室,白金会员接待室和普通会员接待室,不同等级的会员会被分到不同的接待室接待,所有的会员都想进入会场得有入会证明才行,一旦会员进入会场就会根据接待室的等级表示它...原创 2018-04-18 20:11:15 · 229 阅读 · 0 评论 -
jdk1.8 Jmap pid info- 37103 interned Strings occupying 4038832 bytes ,String intern()方法
Heap Configuration: //堆内存初始化配置 MinHeapFreeRatio = 40 //堆最小空闲比率 MaxHeapFreeRatio = 70 //堆最大空闲比率 MaxHeapSize = 2147483648 (2048.0MB) //堆最大空间 NewSize ...原创 2020-03-03 20:45:15 · 1125 阅读 · 0 评论 -
查看JVM参数信息 查看G1堆的使用情况
开发一个需求,内存中需要一些缓存对象,需要先预估下能装多少对象。。查看JVM参数信息jinfo -flags [pid]Attaching to process ID 26841, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.45-b02Non-def...原创 2019-12-21 20:20:41 · 992 阅读 · 0 评论 -
10W个Java对象有多大
背景内存缓存对象,该对象有1个long,2个string命令jps jmap -histo:live id|morehisto[:live]: 显示堆中对象的统计信息原创 2019-11-16 11:14:42 · 2248 阅读 · 1 评论 -
分享一个好用的Jstack分析工具——IBM Thread and Monitor Dump Analyzer for Java
使用方法很简单,直接将dump出来的堆栈信息,打开,便可分析。原创 2019-11-13 20:21:10 · 6027 阅读 · 0 评论 -
线上工程启动日志不滚动了——通过查看堆栈信息排查的过程(ES批量插入)
背景线上工程启动日志,跑着跑着突然不动了,也没报错,看起来一切正常分析相比以前可用,启动时加用了一个@postconstruct注解的方法,所以,这个类是通过主线程加载的,看main线程的堆栈信息足够了堆栈信息目前main线程处于waiting on conditionJava Stackat sun.misc.Unsafe.park(Native Method) at jav...原创 2019-11-13 20:18:28 · 384 阅读 · 0 评论 -
JAVA异常堆栈信息被吃掉的原因
背景线上dubbo请求,报空指针,但是没有具体堆栈信息,无法找到报错的源头任务首先找出源头解决燃眉之急,加try catch 块,一步一步缩小范围,最终发现是map的getOrDefault()方法的一个参数是a->null类型的参数获取到null并给了toString方法,所以报空。行动首先排查了不是dubbo 的异常过滤器(exceptionFilter)导致的。然后goo...原创 2019-07-06 12:17:55 · 3444 阅读 · 0 评论