
JVM
JVM相关调优,理论,介绍等文章
flydean程序那些事
懂程序更懂你!微信公众号:程序那些事 个人主页:www.flydean.com 最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在程序那些事!
展开
-
troubleshoot之:GC调优到底是什么
我们经常会听到甚至需要自己动手去做GC调优。那么GC调优的目的到底是什么呢?让程序跑得更快?让GC消耗更少的资源?还是让程序更加稳定?带着这些疑问来读一下这篇文章,将会得到一个系统的甚至是不一样的结果。原创 2020-08-18 07:44:10 · 19819 阅读 · 5 评论 -
troubleshoot之:使用JFR分析性能问题
文章目录简介GC性能事件同步性能IO性能代码执行的性能其他有用的event简介java程序的性能问题分析是一个很困难的问题。尤其是对于一个非常复杂的程序来说,分析起来更是头疼。还好JVM引入了JFR,可以通过JFR来监控和分析JVM的各种事件。通过这些事件的分析,我们可以找出潜在的问题。今天我们就来介绍一下对java性能分析比较重要的一些JFR事件。GC性能事件一般来说,GC会对java程序的性能操作产生比较重要的影响。我们可以使用jfr监控jdk.GCPhasePause事件。下面是一个jd原创 2020-08-16 09:04:54 · 19903 阅读 · 5 评论 -
troubleshoot之:分析OutOfMemoryError异常
文章目录简介OutOfMemoryErrorjava.lang.OutOfMemoryError: Java heap spacejava.lang.OutOfMemoryError: GC Overhead limit exceededjava.lang.OutOfMemoryError: Requested array size exceeds VM limitjava.lang.OutOfMemoryError: Metaspacejava.lang.OutOfMemoryError: request原创 2020-08-14 10:10:05 · 20205 阅读 · 5 评论 -
JVM系列之:再谈java中的safepoint
文章目录safepoint是什么safepoint的例子线程什么时候会进入safepointsafepoint是怎么工作的总结safepoint是什么java程序里面有很多很多的java线程,每个java线程又有自己的stack,并且共享了heap。这些线程一直运行呀运行,不断对stack和heap进行操作。这个时候如果JVM需要对stack和heap做一些操作该怎么办呢?比如JVM要进行GC操作,或者要做heap dump等等,这时候如果线程都在对stack或者heap进行修改,那么将不是一个稳定原创 2020-08-07 09:54:47 · 21395 阅读 · 7 评论 -
JVM系列之:从汇编角度分析NullCheck
文章目录简介一个普通的virtual call普通方法中的null check反优化的例子总结简介之前我们在讲Virtual call的时候有提到,virtual call方法会根据传递的参数实例的不同而进行优化,从而优化成为classic call,从而提升执行效率。今天我们考虑一下,在virtual call中执行nullcheck的时候,如果已经知道传递的参数是非空的。JIT会对代码进行优化吗?一起来看看吧。一个普通的virtual call我们来分析一下在方法中调用list.add方法的原创 2020-08-06 07:42:39 · 8601 阅读 · 2 评论 -
JVM系列之:从汇编角度分析Volatile
文章目录简介重排序写的内存屏障非lock和LazySet读的性能总结简介Volatile关键字对熟悉java多线程的朋友来说,应该很熟悉了。Volatile是JMM(Java Memory Model)的一个非常重要的关键词。通过是用Volatile可以实现禁止重排序和变量值线程之间可见两个主要特性。今天我们从汇编的角度来分析一下Volatile关键字到底是怎么工作的。重排序这个世界上有两种重排序的方式。第一种,是在编译器级别的,你写一个java源代码,经过javac编译之后,生成的字节码顺序可原创 2020-08-05 09:57:16 · 8714 阅读 · 3 评论 -
JVM系列之:JIT中的Virtual Call接口
文章目录简介最常用的接口List多个List的调用不一样的List调用总结简介上一篇文章我们讲解了Virtual Call的定义并举例分析了Virtual Call在父类和子类中的优化。JIT对类可以进行优化,那么对于interface可不可以做同样的优化么?一起来看看吧。最常用的接口ListList应该是大家最最常用的接口了,我想这个大家应该不会反驳。public interface List<E> extends Collection<E> {今天我们就拿Lis原创 2020-08-04 09:05:24 · 20475 阅读 · 2 评论 -
JVM系列之:JIT中的Virtual Call
文章目录简介Virtual Call和它的本质Virtual Call和classic callVirtual Call优化单实现方法的例子Virtual Call优化多实现方法的例子总结简介什么是Virtual Call?Virtual Call在java中的实现是怎么样的?Virtual Call在JIT中有没有优化?所有的答案看完这篇文章就明白了。Virtual Call和它的本质有用过PrintAssembly的朋友,可能会在反编译的汇编代码中发现有些方法调用的说明是invokevirtu原创 2020-08-03 10:36:36 · 20887 阅读 · 4 评论 -
JVM详解之:类的加载链接和初始化
文章目录简介加载运行时常量池类加载器链接验证准备解析初始化总结简介有了java class文件之后,为了让class文件转换成为JVM可以真正运行的结构,需要经历加载,链接和初始化的过程。这三个过程是怎么工作的呢?在本文中你将会找到答案。加载JVM可以分为三大部分,五大空间和三大引擎,要讲起来也不是特别复杂,先看下面的总体的JVM架构图。从上面的图中,我们可以看到JVM中有三大部分,分别是类加载系统,运行时数据区域和Execution Engine。加载就是根据特定名称查找类或者接口的二进制原创 2020-08-01 17:53:16 · 21248 阅读 · 2 评论 -
JVM系列之:通过一个例子分析JIT的汇编代码
文章目录简介一个简单的例子使用jitWatch进行分析分析字节码分析汇编代码总结简介我们知道JIT会在JVM运行过程中,对热点代码进行优化,传说自然是传说,今天我们通过一个简单的例子来具体分析一下JIT到底是怎么进行优化的。一个简单的例子说干就干,我们先准备一个非常简单的例子:public class AddTest { static int a = 1; static int b = 2; static int c = 3; public static void原创 2020-07-31 10:09:34 · 9212 阅读 · 4 评论 -
JVM详解之:HotSpot VM中的Intrinsic methods
文章目录简介什么是Intrinsic Methods内置方法的特点多样性兼容性java语义的扩展Hotspot VM中的内置方法intrinsic方法和内联方法intrinsic方法的实现Graal总结简介内置方法是什么呢?它和inline method有什么关系呢?内置方法是怎么实现的呢?所有的问题都可以在本文找到答案。什么是Intrinsic Methods什么是内置方法呢?维基百科给出的定义是这样的:在计算机软件中,按照编译器理论,固有方法(或内置方法)是可在给定编程语言中使用的方法,该编原创 2020-07-30 08:14:06 · 20143 阅读 · 2 评论 -
JVM详解之:汇编角度理解本地变量的生命周期
文章目录简介本地变量的生命周期举例说明优化的原因总结简介java方法中定义的变量,它的生命周期是什么样的呢?是不是一定要等到方法结束,这个创建的对象才会被回收呢?带着这个问题我们来看一下今天的这篇文章。本地变量的生命周期在类中,变量类型有类变量,成员变量和本地变量。本地变量指的是定义在方法中的变量,如果我们在方法中定义了一个变量,那么这个变量的生命周期是怎么样的呢?举个例子:public void test(){ Object object = new Object(); d原创 2020-07-29 09:09:20 · 21246 阅读 · 2 评论 -
JVM系列之:String.intern的性能
文章目录简介String.intern和G1字符串去重的区别String.intern的性能举个例子简介String对象有个特殊的StringTable字符串常量池,为了减少Heap中生成的字符串的数量,推荐尽量直接使用String Table中的字符串常量池中的元素。那么String.intern的性能怎么样呢?我们一起来看一下。String.intern和G1字符串去重的区别之前我们提到了,String.intern方法会返回字符串常量池中的字符串对象的引用。而G1垃圾回收器的字符串去重的功原创 2020-07-28 08:39:24 · 20231 阅读 · 2 评论 -
JVM系列之:String.intern和stringTable
文章目录简介intern简介intern和字符串字面量常量分析intern返回的String对象分析实际的问题G1中的去重功能总结简介StringTable是什么?它和String.intern有什么关系呢?在字符串对象的创建过程中,StringTable有起到了什么作用呢?一切的答案都在本文中,快来看看吧。intern简介intern是String类中的一个native方法,所以它底层是用c++来实现的。感兴趣的同学可以去查看下JVM的源码了解更多的内容。这里我们主要谈一下intern的作用。原创 2020-07-26 11:25:57 · 20685 阅读 · 2 评论 -
一文了解JDK12 13 14 GC调优秘籍-附PDF下载
想了解JDK12,13,14中的GC调优秘籍吗?想知道这三个版本中JVM有什么新的变化吗?一起来看看这期的GC调优秘籍,因为JDK12,13,14中的GC变化不太大,所以这里一起做个总结,文末附有相应的PDF下载,希望大家能够喜欢。原创 2020-07-25 12:07:46 · 20896 阅读 · 2 评论 -
JVM系列之:对象的锁状态和同步
文章目录简介java对象头java中锁状态的变化偏向锁biased locking轻量级锁thin lock重量级锁三种锁状态的不同简介锁和同步是java多线程编程中非常常见的使用场景。为了锁定多线程共享的对象,Java需要提供一定的机制来实现共享对象的锁定,从而保证一次只有一个线程能够作用于共享对象。当第二个线程进入同一个区域的时候,必须等待第一个线程解锁该对象。JVM是怎么做到的呢?为了实现这个功能,java对象又需要具备什么样的结构呢?快来一起看看吧。java对象头Java的锁状态其实可以分原创 2020-07-24 09:14:07 · 20817 阅读 · 3 评论 -
JVM系列之:Contend注解和false-sharing
文章目录简介false-sharing的由来怎么解决?使用JOL分析Contended在JDK9中的问题padded和unpadded性能对比Contended在JDK中的使用总结简介现代CPU为了提升性能都会有自己的缓存结构,而多核CPU为了同时正常工作,引入了MESI,作为CPU缓存之间同步的协议。MESI虽然很好,但是不当的时候用也可能导致性能的退化。到底怎么回事呢?一起来看看吧。false-sharing的由来为了提升处理速度,CPU引入了缓存的概念,我们先看一张CPU缓存的示意图:C原创 2020-07-23 09:11:24 · 20926 阅读 · 2 评论 -
一张PDF了解JDK11 GC调优秘籍-附PDF下载
JDK11相比JDK10,添加了一个新的Source-File Mode,可以直接通过java来运行单个java源文件,而不需要进行编译。同时还提供了新的HTTP API,支持响应性stream。当然上面的都不是重点,重点的是JDK11是一个LTS版本,是继JDK8之后的又一个LTS版本,也可能是大家日后使用的最多的一个版本。所以JDK11的JVM参数吸收了JDK9,JDK10的新特性和改动,并在他们的基础上进行了微调。同样在文章最后,我也将JDK11的GC调优秘籍做成了一张PDF,欢迎大家下载原创 2020-07-22 09:20:34 · 21044 阅读 · 2 评论 -
JVM系列之:String,数组和集合类的内存占用大小
文章目录简介数组StringArrayListHashMapHashSetLinkedListtreeMap总结简介之前的文章中,我们使用JOL工具简单的分析过String,数组和集合类的内存占用情况,这里再做一次更详细的分析和介绍,希望大家后面再遇到OOM问题的时候不再抱头痛哭,而是可以有章可循,开始吧。数组先看下JOL的代码和输出://byte arraylog.info("{}",ClassLayout.parseInstance("www.flydean.com".getBytes())原创 2020-07-21 09:24:49 · 22389 阅读 · 3 评论 -
JVM系列之:详解java object对象在heap中的结构
文章目录简介对象和其隐藏的秘密Object对象头数组对象头整个对象的结构简介在之前的文章中,我们介绍了使用JOL这一神器来解析java类或者java实例在内存中占用的空间地址。今天,我们会更进一步,剖析一下在之前文章中没有讲解到的更深层次的细节。一起来看看吧。对象和其隐藏的秘密java.lang.Object大家应该都很熟悉了,Object是java中一切对象的鼻祖。接下来我们来对这个java对象的鼻祖进行一个详细的解剖分析,从而理解JVM的深层次的秘密。工具当然是使用JOL:@Slf4j原创 2020-07-20 08:16:21 · 21870 阅读 · 3 评论 -
JVM详解之:运行时常量池
JVM在运行的时候会对class文件进行加载,链接和初始化的过程。class文件中定义的常量池在JVM加载之后会发生什么神奇的变化呢?快来看一看吧。原创 2020-07-16 09:04:10 · 12907 阅读 · 4 评论 -
JVM详解之:java class文件的密码本
一切的一切都是从javac开始的。从那一刻开始,java文件就从我们肉眼可分辨的文本文件,变成了冷冰冰的二进制文件。变成了二进制文件是不是意味着我们无法再深入的去了解java class文件了呢?答案是否定的。机器可以读,人为什么不能读?只要我们掌握java class文件的密码表,我们可以把二进制转成十六进制,将十六进制和我们的密码表进行对比,就可以轻松的解密了。下面,让我们开始这个激动人心的过程吧。原创 2020-07-15 09:21:52 · 11570 阅读 · 4 评论 -
一张PDF了解JDK10 GC调优秘籍-附PDF下载
JDK10 GC调优秘籍,一张PDF就能搞定的事情,还不快来看看!原创 2020-07-14 09:13:32 · 11538 阅读 · 4 评论 -
JVM中栈的frames详解
文章目录简介JVM中的栈FrameLocal Variables本地变量Operand StacksDynamic Linking动态链接方法执行完毕简介我们知道JVM运行时数据区域专门有一个叫做Stack Area的区域,专门用来负责线程的执行调用。那么JVM中的栈到底是怎么工作的呢?快来一起看看吧。JVM中的栈小师妹:F师兄,JVM为每个线程的运行都分配了一个栈,这个栈到底是怎么工作的呢?小师妹,我们先看下JVM的整体运行架构图:我们可以看到运行时数据区域分为5大部分。堆区是存储共享对象原创 2020-07-10 08:34:37 · 12627 阅读 · 3 评论 -
小师妹学JVM之:Dirty cards和PLAB
文章目录简介分代收集器中的空间划分Write barrier和Dirty cardsPLABold space分配对象总结简介分代垃圾回收器在进行minor GC的时候会发生什么操作呢?有没有什么提高效率的手段呢?今天我们和小师妹一起来了解一下垃圾回收中的Dirty cards和PLAB分代收集器中的空间划分小师妹:F师兄,能再讲讲分代垃圾收集器中的空间划分吗?分代垃圾回收器中的Eden,Old和Survivor space几个大家应该都很熟悉的分代技术。Young Gen被划分为1个Eden原创 2020-07-09 09:01:18 · 12109 阅读 · 4 评论 -
小师妹学JVM之:JVM中的Safepoints
java程序员都听说过GC,大家也都知道GC的目的是扫描堆空间,然后将那些标记为删除的对象从堆空间释放,以提升可用的堆空间。今天我们会来探讨一下隐藏在GC背后的一个小秘密Safepoints。原创 2020-07-08 09:15:46 · 12241 阅读 · 4 评论 -
小师妹学JVM之:cache line对代码性能的影响
文章目录简介一个奇怪的现象两个问题的答案CPU cache lineinc 和 add总结简介读万卷书不如行万里路,讲了这么多assembly和JVM的原理与优化,今天我们来点不一样的实战。探索一下怎么使用assembly来理解我们之前不能理解的问题。一个奇怪的现象小师妹:F师兄,之前你讲了那么多JVM中JIT在编译中的性能优化,讲真的,在工作中我们真的需要知道这些东西吗?知道这些东西对我们的工作有什么好处吗?um…这个问题问得好,知道了JIT的编译原理和优化方向,我们的确可以在写代码的时候稍微注原创 2020-07-07 09:05:11 · 12198 阅读 · 2 评论 -
JIT的Profile神器JITWatch
简介老是使用命令行工具在现代化社会好像已经跟不上节奏了,尤其是在做JIT分析时,使用LogCompilation输出的日志实在是太大了,让人望而生畏。有没有什么更加简便的方法来分析JIT日志呢?快来和小师妹一起来学习JITWatch吧。什么是JIT小师妹,F师兄,JIT就是Just In Time compilers。能不能再总结一下JIT到底是做什么的呢?当然没问题,JIT主要有两个作用,第一个作用大家应该已经知道了,就是在运行时将byte code编译成为机器码,提高程序的执行速度。第二个作用原创 2020-07-05 17:13:50 · 13086 阅读 · 2 评论 -
深入理解编译优化之循环展开和粗化锁
文章目录简介循环展开和粗化锁分析Assembly日志禁止Loop unrolling总结简介之前在讲JIT的时候,有提到在编译过程中的两种优化循环展开和粗化锁,今天我们和小师妹一起从Assembly的角度来验证一下这两种编译优化方法,快来看看吧。循环展开和粗化锁小师妹:F师兄,上次你讲到在JIT编译的过程中会进行一些编译上面的优化,其中就有循环展开和粗化锁。我对这两种优化方式很感兴趣,能不能展开讲解一下呢?当然可以,我们先来回顾一下什么是循环展开。更多精彩内容且看:区块链从入门到放弃系列教程原创 2020-07-04 09:04:03 · 12451 阅读 · 4 评论 -
小师妹学JVM之:JIT中的PrintAssembly续集
文章目录简介JDK8和JDK14中的PrintAssemblyJDK8中使用AssemblyJDK14中的Assembly在JMH中使用Assembly总结简介上篇文章和小师妹一起介绍了PrintAssembly和PrintAssembly在命令行的使用,今天本文将会更进一步讲解如何在JDK8和JDK14中分别使用PrintAssembly,并在实际的例子中对其进行进一步的深入理解。JDK8和JDK14中的PrintAssembly小师妹:F师兄,上次你介绍的PrintAssembly的自测命令,怎原创 2020-07-03 09:02:42 · 12013 阅读 · 2 评论 -
小师妹学JVM之:逃逸分析和TLAB
逃逸分析我们在JDK14中JVM的性能优化一文中已经讲过了,逃逸分析的结果就是JVM会在栈上分配对象,从而提升效率。如果我们在多线程的环境中,如何提升内存的分配效率呢?快来跟小师妹一起学习TLAB技术吧。原创 2020-07-01 09:03:23 · 6938 阅读 · 2 评论 -
一张PDF了解JDK9 GC调优秘籍-附PDF下载
JDK9 GC调优秘籍,一张PDF就够了!原创 2020-06-30 06:50:24 · 6966 阅读 · 1 评论 -
小师妹学JVM之:JIT中的PrintAssembly
想不想了解JVM最最底层的运行机制?想不想从本质上理解java代码的执行过程?想不想对你的代码进行进一步的优化和性能提升?如果你的回答是yes。那么这篇文章非常适合你,因为本文将会站在离机器码最近的地方来观看JVM的运行原理:Assembly。原创 2020-06-29 07:27:38 · 7141 阅读 · 2 评论 -
小师妹学JVM之:java的字节码byte code简介
Byte Code也叫做字节码,是连接java源代码和JVM的桥梁,源代码编译成为字节码,而字节码又被加载进JVM中运行。字节码怎么生成,怎么查看字节码,隐藏在Byte Code背后的秘密是什么呢?快跟小师妹一起来看看吧。原创 2020-06-25 10:10:08 · 7870 阅读 · 2 评论 -
小师妹学JVM之:JIT中的PrintCompilation
上篇文章我们讲到了JIT中的LogCompilation,将编译的日志都收集起来,存到日志文件里面,并且详细的解释了LogCompilation日志文件中的内容定义。今天我们再和小师妹一起学习LogCompilation的姊妹篇PrintCompilation,看看都有什么妙用吧。原创 2020-06-24 08:58:07 · 10619 阅读 · 2 评论 -
八张图彻底了解JDK8 GC调优秘籍-附PDF下载
你和GC调试专家之间就差一张PDF! 为了更好的让大家理解JDK8中 GC的调优的秘籍,这里特意准备了八张图。在本文的最后,还附带了一个总结的PDF all in one文档,大家把PDF下载回去,遇到问题就看两眼,不美吗?原创 2020-06-23 07:14:22 · 7638 阅读 · 3 评论 -
小师妹学JVM之:JIT中的LogCompilation
我们知道在JVM中为了加快编译速度,引入了JIT即时编译的功能。那么JIT什么时候开始编译的,又是怎么编译的,作为一个高傲的程序员,有没有办法去探究JIT编译的秘密呢?答案是有的,今天和小师妹一起带大家来看一看这个编译背后的秘密。原创 2020-06-19 07:04:05 · 5652 阅读 · 4 评论 -
小师妹学JVM之:JDK14中JVM的性能优化
上一篇文章我们讲到了JVM为了提升解释的性能,引入了JIT编译器,今天我们再来从整体的角度,带小师妹看看JDK14中的JVM有哪些优化的方面,并且能够从中间得到那些启发。原创 2020-06-18 06:51:14 · 6585 阅读 · 4 评论 -
小师妹学JVM之:深入理解JIT和编译优化-你看不懂系列
小师妹已经学完JVM的简单部分了,接下来要进入的是JVM中比较晦涩难懂的概念,这些概念是那么的枯燥乏味,甚至还有点惹人讨厌,但是要想深入理解JVM,这些概念是必须的,我将会尽量尝试用简单的例子来解释它们,但一定会有人看不懂,没关系,这个系列本不是给所有人看的。原创 2020-06-17 06:45:17 · 12689 阅读 · 6 评论 -
小师妹学JVM之:GC的垃圾回收算法
JVM的重要性不言而喻了,如果把java的应用程序比作一辆跑车,那么JVM就是这辆车的发动机,没有它,java程序就成了空中楼阁,无根浮萍。而在JVM中有一块内存区域叫做运行时数据区域,存储了运行时所需要的所有对象,而Heap Area则是其中最大的一块。内存毕竟不是无限的,所以就需要一种机制来将不再使用的对象进行回收,这种机制就是今天我们要讲的GC。原创 2020-06-16 07:10:36 · 14684 阅读 · 6 评论