编者按:笔者遇到一个非常典型的问题,应用在 X86 正常运行,在 AArch64 上 JVM 就会崩溃。这个典型的 JVM 内部问题。笔者通过分析最终定位到是由于 JVM 中模板解释器代码存在 bug 导致在弱内存模型的平台上 Crash。 在分析过程中,涉及到非常多的 JVM 内部知识,比如对象头、GC 复制算法操作、CAS 操作、字节码执行、...
毕昇 JDK 发布的所有版本均解决了该问题,其他 JDK 在 jdk8u292、jdk11.0.9、jdk13 以后的版本修复该问题。 bug 描述 目标进程在 aarch64 平台上运行,使用的 GC 算法为 CMS(-XX:+UseConcMarkSweepGC),会概率性地发生 JVM crash,且问题发生的概率极低。我们在 aarch64 平台上使用 fuzz 测试,运行目标进程 50w...
前言 JVM的堆外内存泄露的定位一直是个比较棘手的问题。此次的Bug查找从堆内内存的泄露反推出堆外内存,同时对物理内存的使用做了定量的分析,从而实锤了Bug的源头。笔者将此Bug分析的过程写成博客,以飨读者。 由于物理内存定量分析部分用到了linux kernel虚拟内存管理的知识,读者如果有兴趣了解请看ulk3(《深入理解linux...
最近我们公司在帮一个客户查一个JVM的问题(JDK1.8.0_191-b12),发现一个系统老是被OS Kill掉,是内存泄露导致的。在查的过程中,阴差阳错地发现了JVM另外的一个Bug。这个Bug可能会导致大量物理内存被使用,我们已经反馈给了社区,并得到快速反馈,预计在OpenJDK8最新版中发布(JDK11中也存在这个问题)。 image.png ...
我的日常工作之一是给 OpenJDK 上游修 bug。某天我百无聊赖,用最新 build 出来的 JDK 在 RISC-V 平台跑测试,发现 tier1 测试居然挂了一大片。给不了解 OpenJDK 的朋友们解释一下:JDK 仓库公开的测试按重要程度分为 tier1 到 tier4 四个级别[1],tier1 是其中优先级最高的。如果 tier1 中有测试挂掉...
「是不是我的代码出发了WCS客户端的Bug,导致不断地申请直接内存的调用,最终吃满内存。」 我联系上了WCS的值班人,将我们遇到的问题和他们描述了一下,他们回复我们,会在他们本地执行下写入操作的压测,看看能不能复现我们的问题。 既然等待他们的反馈还需要时间,我们就准备先自己琢磨下原因。
老早之前写过一篇文章,关于attach机制的,比如大家常用的jstack,jmap等工具的主要原理都和attach机制有关,在JVM里处理这些命令的线程主要是Attach Listener这个线程,这个线程在JVM里是唯一的,我之前也一直以为是唯一的,但是我们同事最近在做一个线程分析产品的时候,发现我们抓到了多个Attach Listener线程,这让我也很疑惑...
最近我们公司在帮一个客户查一个JVM的问题(JDK1.8.0_191-b12),发现一个系统老是被OS Kill掉,是内存泄露导致的。在查的过程中,阴差阳错地发现了JVM另外的一个Bug。这个Bug可能会导致大量物理内存被使用,我们已经反馈给了社区,并得到快速反馈,预计在OpenJDK8最新版中发布(JDK11中也存在这个问题)。
// 示例代码一:修复代码逻辑publicvoidmethodWithLockBug(){synchronized(lock){// 锁的相关逻辑}// 其他代码逻辑}// 示例代码二:优化锁使用publicvoidmethodWithOptimizedLock(){lock.lock();// 使用可重入锁try{// 锁的相关逻辑}finally{lock.unlock();// 释放锁}// 其他代码逻辑} ...
DJL自身bug, NDManager即使执行了close,但是还是被引用,导致自身无法被回收。 虽然排查之后再进行复盘,根据各种现象,顺理成章就排查了问题的根源。 但是一开始排查时,毫无头绪,各种细节充斥其中,有些是原因,有些是结果, 比如最开始怀疑是CPU彪高导致响应时间变长,但其实是因为OOM导致tomcat 重启导致的CPU彪高。只能...