首页
AI Coding
NEW
沸点
课程
直播
活动
AI刷题
APP
插件
搜索历史
清空
创作者中心
写文章
发沸点
写笔记
写代码
草稿箱
创作灵感
查看更多
会员
登录
注册
JVM系列文章
程序那些事
创建于2021-08-26
订阅专栏
JVM系列文章
等 9 人订阅
共32篇文章
创建于2021-08-26
订阅专栏
默认顺序
默认顺序
最早发布
最新发布
JVM系列之:再谈java中的safepoint
java程序里面有很多很多的java线程,每个java线程又有自己的stack,并且共享了heap。这些线程一直运行呀运行,不断对stack和heap进行操作。 比如JVM要进行GC操作,或者要做heap dump等等,这时候如果线程都在对stack或者heap进行修改,那么将…
JVM系列之:从汇编角度分析NullCheck
之前我们在讲Virtual call的时候有提到,virtual call方法会根据传递的参数实例的不同而进行优化,从而优化成为classic call,从而提升执行效率。 今天我们考虑一下,在virtual call中执行nullcheck的时候,如果已经知道传递的参数是非空…
JVM系列之:从汇编角度分析Volatile
Volatile关键字对熟悉java多线程的朋友来说,应该很熟悉了。Volatile是JMM(Java Memory Model)的一个非常重要的关键词。通过是用Volatile可以实现禁止重排序和变量值线程之间可见两个主要特性。 今天我们从汇编的角度来分析一下Volatile…
JVM系列之:JIT中的Virtual Call接口
上一篇文章我们讲解了Virtual Call的定义并举例分析了Virtual Call在父类和子类中的优化。 一起来看看吧。 List应该是大家最最常用的接口了,我想这个大家应该不会反驳。 今天我们就拿List来做例子,体验一下JIT优化接口的奥秘。 我们可以看到JIT中先对A…
JVM系列之:JIT中的Virtual Call
所有的答案看完这篇文章就明白了。 有用过PrintAssembly的朋友,可能会在反编译的汇编代码中发现有些方法调用的说明是invokevirtual,实际上这个invokevirtual就是Virtual Call。 我们定义了两个类,CustObj是父类CustObj2是子…
JVM详解之:类的加载链接和初始化
有了java class文件之后,为了让class文件转换成为JVM可以真正运行的结构,需要经历加载,链接和初始化的过程。 这三个过程是怎么工作的呢?在本文中你将会找到答案。 JVM可以分为三大部分,五大空间和三大引擎,要讲起来也不是特别复杂,先看下面的总体的JVM架构图。 从…
JVM系列之:通过一个例子分析JIT的汇编代码
我们知道JIT会在JVM运行过程中,对热点代码进行优化,传说自然是传说,今天我们通过一个简单的例子来具体分析一下JIT到底是怎么进行优化的。 这个例子中我们定义了三个类变量,然后通过一个add方法对其中的变量进行累加。 然后在main方法中对add方法调用10000次。调用这么…
JVM详解之:HotSpot VM中的Intrinsic methods
内置方法是什么呢?它和inline method有什么关系呢?内置方法是怎么实现的呢?所有的问题都可以在本文找到答案。 在计算机软件中,按照编译器理论,固有方法(或内置方法)是可在给定编程语言中使用的方法,该编程语言的实现由编译器专门处理。通常,它可以将自动生成的指令序列替换为…
JVM详解之:汇编角度理解本地变量的生命周期
带着这个问题我们来看一下今天的这篇文章。 在类中,变量类型有类变量,成员变量和本地变量。 在上面的test方法中,定义了一个object本地变量,然后又执行了一个方法。 因为在java中,我们无法直接控制对象的生命周期,对象的回收是由垃圾回收器自动进行的。 通常来说这个obje…
JVM系列之:String.intern的性能
String对象有个特殊的StringTable字符串常量池,为了减少Heap中生成的字符串的数量,推荐尽量直接使用String Table中的字符串常量池中的元素。 那么String.intern的性能怎么样呢?我们一起来看一下。 之前我们提到了,String.intern方…
JVM系列之:String.intern和stringTable
一切的答案都在本文中,快来看看吧。 intern是String类中的一个native方法,所以它底层是用c++来实现的。感兴趣的同学可以去查看下JVM的源码了解更多的内容。 这里我们主要谈一下intern的作用。 String class维护了一个私有的String pool,…
JVM系列之:对象的锁状态和同步
锁和同步是java多线程编程中非常常见的使用场景。为了锁定多线程共享的对象,Java需要提供一定的机制来实现共享对象的锁定,从而保证一次只有一个线程能够作用于共享对象。当第二个线程进入同一个区域的时候,必须等待第一个线程解锁该对象。 JVM是怎么做到的呢?为了实现这个功能,ja…
JVM系列之:Contend注解和false-sharing
现代CPU为了提升性能都会有自己的缓存结构,而多核CPU为了同时正常工作,引入了MESI,作为CPU缓存之间同步的协议。MESI虽然很好,但是不当的时候用也可能导致性能的退化。 到底怎么回事呢?一起来看看吧。 CPU缓存是位于CPU与内存之间的临时数据交换器,它的容量比内存小的…
JVM系列之:String,数组和集合类的内存占用大小
之前的文章中,我们使用JOL工具简单的分析过String,数组和集合类的内存占用情况,这里再做一次更详细的分析和介绍,希望大家后面再遇到OOM问题的时候不再抱头痛哭,而是可以有章可循,开始吧。 可以看到数组对象的对象头大小是16字节,再加上数组里面的内容长度是15字节,再加上1…
JVM系列之:详解java object对象在heap中的结构
在之前的文章中,我们介绍了使用JOL这一神器来解析java类或者java实例在内存中占用的空间地址。 今天,我们会更进一步,剖析一下在之前文章中没有讲解到的更深层次的细节。一起来看看吧。 java.lang.Object大家应该都很熟悉了,Object是java中一切对象的鼻祖…
JVM详解之:运行时常量池
JVM在运行的时候会对class文件进行加载,链接和初始化的过程。class文件中定义的常量池在JVM加载之后会发生什么神奇的变化呢?快来看一看吧。 字符串常量,类和接口名字,字段名,和其他一些在class中引用的常量。 但是只有class文件中的常量池肯定是不够的,因为我们需…
JVM详解之:java class文件的密码本
一切的一切都是从javac开始的。从那一刻开始,java文件就从我们肉眼可分辨的文本文件,变成了冷冰冰的二进制文件。 变成了二进制文件是不是意味着我们无法再深入的去了解java class文件了呢?答案是否定的。 机器可以读,人为什么不能读?只要我们掌握java class文件…
JVM中栈的frames详解
我们知道JVM运行时数据区域专门有一个叫做Stack Area的区域,专门用来负责线程的执行调用。那么JVM中的栈到底是怎么工作的呢?快来一起看看吧。 我们可以看到运行时数据区域分为5大部分。 堆区是存储共享对象的地方,而栈区是存储线程私有对象的地方。 因为是栈的结构,所以这个…
小师妹学JVM之:Dirty cards和PLAB
分代垃圾回收器中的Eden,Old和Survivor space几个大家应该都很熟悉的分代技术。 Young Gen被划分为1个Eden Space和2个Suvivor Space。当对象刚刚被创建的时候,是放在Eden space。 当Eden space满的时候,就会触发m…
小师妹学JVM之:JVM中的Safepoints
java程序员都听说过GC,大家也都知道GC的目的是扫描堆空间,然后将那些标记为删除的对象从堆空间释放,以提升可用的堆空间。今天我们会来探讨一下隐藏在GC背后的一个小秘密Safepoints。 小师妹:F师兄,GC的垃圾回收器的种类为什么会有这么多呀?使用起来不是很麻烦。并且我…
下一页