JVM源码分析之Attach机制实现完全解读 (club.perfma.com)
在讲这个之前,我们先来点大家都知道的东西,当我们感觉线程一直卡在某个地方,想知道卡在哪里,首先想到的是进行线程dump,而常用的命令是jstack ,我们就可以看到如下线程栈了
by @PerfMa社区 2020-05-26 11:00 分享 查看详情
一个导致JVM物理内存消耗大的Bug (club.perfma.com)
发现一个系统老是被OS Kill掉,是内存泄露导致的。在查的过程中,阴差阳错地发现了JVM另外的一个Bug。这个Bug可能会导致大量物理内存被使用,我们已经反馈给了社区,并得到快速反馈,预计在OpenJDK8最新版中发布(JDK11中也存在这个问题)。
by @PerfMa社区 2020-05-22 10:48 分享 查看详情
从X86指令深扒JVM的位移操作 (club.perfma.com)
最近做的一个项目碰到了一个移位的问题,因为位移操作溢出导致结果不准确,本来可以点到为止,问题也能很快解决,但是不痛不痒的感觉着实让人不爽,于是深扒了下个中细节,直到看到Intel的指令规约才算释然,希望这篇文章能引起大家共鸣。
by @PerfMa社区 2020-05-19 10:56 分享 查看详情
进程物理内存远大于Xmx的问题分析 (club.perfma.com)
最近经常被问到一个问题,”为什么我们系统进程占用的物理内存(Res/Rss)会远远大于设置的Xmx值”,比如Xmx设置1.7G,但是top看到的Res的值却达到了3.0G,随着进程的运行,Res的值还在递增,直到达到某个值,被OS当做bad process直接被kill掉了。
by @PerfMa社区 2020-05-12 14:47 分享 查看详情
类初始化死锁导致线程被打爆!打爆!爆! (club.perfma.com)
我们线上的现象是发现非常多的线程都卡死在同一个地方,也不是在做类加载,如果是死循环,那cpu肯定上去了,但是cpu并没有上去,因此比较诡异
by @PerfMa社区 2020-05-07 14:38 分享 查看详情
聊一个可能有惊喜的System GC知识点 (club.perfma.com)
有个系统一启动怎么就发生了System GC(从GC日志里看到了GC Cause是System GC),按照我的经验,这十有八九是堆外内存不够所致,但是启动就不够,这似乎不太可能,于是我又说是不是自己调用了,搜了下没有地方调。
by @PerfMa社区 2020-04-28 10:22 分享 查看详情
又抓了一个导致频繁GC的鬼--数组动态扩容 (club.perfma.com)
系统一直在做cms gc,但是老生代一直不降下去,但是执行一次jmap -histo:live之后,也就是主动触发一次full gc之后,通过jstat -gcutil来看老生代一下就降下去了,初看下理论上不太可能,因为full gc也会对old做回收。
by @PerfMa社区 2020-04-24 16:05 分享 查看详情
JVM源码分析之JDK8下的僵尸(无法回收)类加载器 (club.perfma.com)
现象是有一些类加载器是作为key放到WeakHashMap里的,但是经历过多次full gc之后,依然坚挺地存在内存里,但是从代码上来说这些类加载器是应该被回收的,因为没有任何强引用可以到达这些类加载器了
by @PerfMa社区 2020-04-21 16:25 分享 查看详情
学习JVM参数前必须了解的 (club.perfma.com)
可以把JVM想象成相机,JVM参数想象成光圈大小,快门速度之类的参数值,这些参数对程序的运行会影响挺大。
by @PerfMa社区 2020-04-16 11:08 分享 查看详情
JVM源码分析之System.currentTimeMillis及nanoTime原理详解 (club.perfma.com)
有同事问了我一个现象很诡异的问题,说JDK7和JDK8下的System.nanoTime()输出完全不一样,而且差距还非常大,是不是两个版本里的实现不一样,之前我也没注意过这个细节,觉得非常奇怪,于是自己也在本地mac机器上马上测试了一下
by @PerfMa社区 2020-04-14 11:35 分享 查看详情
从一起GC血案谈到反射原理 (club.perfma.com)
首先回答一下提问者的问题。这主要是由于存在大量反射而产生的临时类加载器和 ASM 临时生成的类,这些类会被保留在 Metaspace,一旦 Metaspace 即将满的时候,就会触发 FullGc,已达到回收不再被使用的类对象的目的。具体问题请参考接下来的内容,更好的了解反射的实现原理。
by @PerfMa社区 2020-04-09 10:18 分享 查看详情
不可逆的类初始化过程 (club.perfma.com)
类的加载过程说复杂很复杂,说简单也简单,说复杂是因为细节很多,比如说今天要说的这个,可能很多人都不了解;说简单,大致都知道类加载有这么几个阶段,loaded->linked->initialized
by @PerfMa社区 2020-04-07 10:36 分享 查看详情
谨防JDK8重复类定义造成的内存泄漏 (club.perfma.com)
如今JDK8成了主流,大家都紧锣密鼓地进行着升级,享受着JDK8带来的各种便利,然而有时候升级并没有那么顺利?比如说今天要说的这个问题。我们都知道JDK8在内存模型上最大的改变是,放弃了Perm,迎来了Metaspace的时代。
by @PerfMa社区 2020-04-02 10:30 分享 查看详情
JDK的sql设计不合理导致的驱动类初始化死锁问题 (club.perfma.com)
当我们一个系统既需要mysql驱动,也需要oracle驱动的时候,在并发加载初始化这些驱动类的过程中产生死锁的可能性非常大,下面是一个模拟的例子,对于Thread2的实现其实是jdk里java.sql.DriverService的逻辑,也是我们第一次调用java.sql.DriverManager.registerDriver注册一个驱动实例要走的逻辑(jdk1.6下),不过这篇文章是使用我们生产环境的一个系统的线程dump和内存dump为基础进行分析展开的。
by @PerfMa社区 2020-03-31 10:32 分享 查看详情
类初始化导致死锁 (club.perfma.com)
本文要说的是之前在生产环境上碰到,是类初始化导致的死锁,恩,你没看错,确实是类初始化导致的死锁,本文将这个问题描述的场景更加通用化了。
by @PerfMa社区 2020-03-26 10:22 分享 查看详情
JVM源码分析之javaagent原理完全解读 (club.perfma.com)
本文重点讲述javaagent的具体实现,因为它面向的是我们java程序员,而且agent都是用java编写的,不需要太多的c/c++编程基础,不过这篇文章里也会讲到JVMTIAgent(c实现的),因为javaagent的运行还是依赖于一个特殊的JVMTIAgent。
by @PerfMa社区 2020-03-24 10:25 分享 查看详情
JVM源码分析之堆外内存完全解读 (club.perfma.com)
说到堆外内存,那大家肯定想到堆内内存,这也是我们大家接触最多的,我们在jvm参数里通常设置-Xmx来指定我们的堆的最大值,不过这还不是我们理解的Java堆
by @PerfMa社区 2020-03-19 11:02 分享 查看详情
JVM源码分析之Object.wait/notify(All)完全解读 (club.perfma.com)
本文有些东西是我自己的理解,比如为什么JDK一开始要这么设计,初衷是什么,没怎么去找相关资料,所以只能谈谈自己的理解,所以大家看到文章之后可以谈谈自己的看法,对于实现部分我倒觉得说清楚问题不大,code is here,看明白了就知道怎么回事了。
by @PerfMa社区 2020-03-17 10:12 分享 查看详情
JVM 源码分析之一个 Java 进程究竟能创建多少线程 (club.perfma.com)
虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从 JVM 源码角度来分析,更多的来自于 Linux Kernel 的源码分析,今天要说的是 JVM 里比较常见的一个问题。
by @PerfMa社区 2020-03-12 09:51 分享 查看详情
JVM源码分析之jstat工具原理完全解读 (club.perfma.com)
jstat是hotspot自带的工具,和java一样也位于JAVA_HOME/bin下面,我们通过该工具可以实时了解当前进程的gc,compiler,class,memory等相关的情况。
by @PerfMa社区 2020-03-10 10:24 分享 查看详情