YGC问题排查,又让我涨姿势了!
在高并发下,Java程序的GC问题属于很典型的一类问题,带来的影响往往会被进一步放大。不管是「GC频率过快」还是「GC耗时太长」,由于GC期间都存在Stop The World问题,因此很容易导致服务
【全网首发】一些可以显著提高 Java 启动速度方法
我们线上的业务 jar 包基本上普遍比较庞大,动不动一个 jar 包上百 M,启动时间在分钟级,拖慢了我们在故障时快速扩容的响应。于是做了一些分析,看看 Java 程序启动慢到底慢在哪里,如何去优化,目前的效果是大部分大型应用启动时间可以缩短 30%~50%主要有下面这些内容修改 asy
JVM 源码分析之一个 Java 进程究竟能创建多少线程
概述虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从 JVM 源码角度来分析,更多的来自于 Linux Kernel 的源码分析,今天要说的是 JVM 里比较常见的一个问题。这个问题可能有
一次完整的JVM堆外内存泄漏故障排查记录
前言记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些「JVM内存分配的原理分析」以及「常用的JVM问题排查手段和工具分享」,希望对大家有所帮助。在整个排查过程中,我也走了不少弯路,但是
记一次Synchronized关键字使用不合理,导致的多线程下线程阻塞问题排查
在为客户进行性能诊断调优时,碰到了一个Synchronized关键字使用不合理导致多线程下线程阻塞的情况。用文字记录下了问题的整个发现-排查-分析-优化过程,排查过程中使用了我司商业化产品——XLan
一次大量 JVM Native 内存泄露的排查分析(64M 问题)
我们有一个线上的项目,刚启动完就占用了使用 top 命令查看 RES 占用了超过 1.5G,这明显不合理,于是进行了一些分析找到了根本的原因,下面是完整的分析过程,希望对你有所帮助。会涉及到下面这些内容Linux 经典的 64M 内存问题堆内存分析、Native 内存分析的基本套路
线上服务的FGC问题排查,看这篇就够了!
这篇文章以一个Full GC频繁的线上案例作为引子,详细介绍GC的排查过程,另外会结合GC的运行原理给出一份实践指南。内容分成3个部分:从一次Full GC频繁的线上案例说起、GC的运行原理介绍、排查Full GC问题的实践指南
一次 Java 进程 OOM 的排查分析(glibc 篇)
遇到了一个 glibc 导致的内存回收问题,查找原因和实验的的过程是比较有意思的,主要会涉及到下面这些:- Linux 中典型的大量 64M 内存区域问题- glibc 的内存分配器 ptmalloc
官方文档竟然有坑!关于G1参数InitiatingHeapOccupancyPercent的正确认知 #我在性能调优路上的打怪日记#
问题前两天,一个群友在群中提出一个疑问:G1里的XX:InitiatingHeapOccupancyPercent,默认是45。他看网上有两种说法,一种是整个堆占用率超过45%时开始并发标记周期;另一
字节对齐与Java的指针压缩(下)-指针压缩
在上一篇文章[《字节对齐与Java的指针压缩(上)-字节对齐的渊源》](https://heapdump.cn/article/2545511)中我们讲到了字节对齐的部分渊源与Java选择8字节对齐的
记一次类加载失败导致线程阻塞问题排查
作为PerfMa解决方案管理部门的技术专家,我在工作遇见过很多各种问题导致的性能问题,并参与了为客户的系统进行性能诊断调优的全过程。这一次碰到了一个类加载失败导致的性能问题。用文字记录下了问题的整个发
又发现一个导致JVM物理内存消耗大的Bug(已提交Patch)
概述 最近我们公司在帮一个客户查一个JVM的问题(JDK1.8.0_191-b12),发现一个系统老是被OS Kill掉,是内存泄露导致的。在查的过程中,阴差阳错地发现了JVM另外的一个Bug。这个B
记一次堆外内存泄漏排查过程
本文涉及以下内容 开启NMT查看JVM内存使用情况 通过pmap命令查看进程物理内存使用情况 smaps查看进程内存地址 gdb命令dump内存块 背景最近收到运维反馈,说有项目的一个
g1源码之fullGC算法详解
关于g1的gc源码系列解析就剩下fullGC了,其实关于fullGC的源码方面并不是很难,相对于youngGC和mixed GC和并发标记来说,相对好阅读一些,网上也有一些文章是讲述fullGC的源码
Spring Boot引起的“堆外内存泄漏”排查及经验总结
本文来自美团技术团队,作者纪兵https://tech.meituan.com/2019/01/03/spring-boot-native-memory-leak.html 背景为了更好地实现对项目的
高吞吐、低延迟 Java 应用的 GC 优化实践
本篇原文作者是 LinkedIn 的 Swapnil Ghike,这篇文章讲述了 LinkedIn 的 Feed 产品的 GC 优化过程,虽然文章写作于 April 8, 2014,但其中的很多内容和
【全网首发】一次想不到的 Bootstrap 类加载器带来的 Native 内存泄露分析
最近我们线上有同学反馈,java 服务在接入了支持预发的 javaagent 以后会出现缓存的内存增长,去掉 agent 启动以后内存增长正常。于是分析了一下这个问题,写了这篇文章。
JVM源码分析之Metaspace解密
概述metaspace,顾名思义,元数据空间,专门用来存元数据的,它是jdk8里特有的数据结构用来替代perm,这块空间很有自己的特点,前段时间公司这块的问题太多了,主要是因为升级了中间件所致,看到大
协助美团kafka团队定位到的一个JVM Crash问题
概述 有挺长一段时间没写技术文章了,正好这两天美团kafka团队有位小伙伴加了我微信,然后咨询了一个JVM crash的问题,大家对crash的问题都比较无奈,因为没有现场,信息量不多,碰到这类问题我
揪出一个导致GC慢慢变长的JVM设计缺陷
今天要给大家分享的内容和 YGC(Young GC)有关,是我最近碰到的一个案例,希望将排查思路分享给大家,如果大家后面碰到类似的问题,可以直接作为一个经验来排查。 我之前在公众号里其实写过几篇 Y
进程无故消失的破案历程
概述 前段时间公司有个系统的进程老是无故退出,在客户那边好好的,在家里服务器上老是出现,而且出现的时间也没啥规律,当然最终查出来还是有规律的,不过这个规律比较特别。大家看了后面的内容之后就明白了
JVM源码分析之jstat工具原理完全解读
概述jstat是hotspot自带的工具,和java一样也位于`JAVA_HOME/bin`下面,我们通过该工具可以实时了解当前进程的gc,compiler,class,memory等相关的情况,具体
关于内存溢出,咱再聊点有意思的?
概述 上篇文章讲了JVM在GC上的一个设计缺陷,揪出一个导致GC慢慢变长的JVM设计缺陷,可能有不少人还是没怎么看明白的,今天准备讲的大家应该都很容易看明白 本文其实很犹豫写不写,因为感觉没有
Java Reference核心原理分析
带着问题,看源码针对性会更强一点、印象会更深刻、并且效果也会更好。所以我先卖个关子,提两个问题(没准下次跳槽时就被问到)。 - 我们可以用ByteBuffer的allocateDirect方法,申请一
一次线上服务高 CPU 占用优化实践
线上有一个非常繁忙的服务的 JVM 进程 CPU 经常跑到 100% 以上,下面写了一下排查的过程。通过阅读这篇文章你会了解到下面这些知识。- Java 程序 CPU 占用高的排查思路- 可能造成线上
代表Java未来的ZGC深度剖析,牛逼!
JAVA程序最爽的地方是它的GC机制,开发人员不需要关注内存申请和回收问题。同时,JAVA程序最头疼的地方也是它的GC机制,因为掌握JVM和GC调优是一件非常困难的事情。在ParallelOldGC、
警惕大量类加载器的创建导致诡异的Full GC
概述 今天有个同事找我,其实好像之前就找过我,一直因为太忙,后面就忘记他的事了,到今天还没查出原因就又找了过来,现象是系统老是进行Full GC,在启动没过多久就会发生Full GC,这个现象相
g1源码之Mixed GC与ConcurrentMark细节详解
继上次全面刨析了youngGC的源码后,这次笔者又阅读了关于Mixed GC的部分源码,相对于youngGC,Mixed GC部分更好阅读和理解一些(ps:不知道是不是因为已经有了读youngGC代码
一次线上JVM调优实践,FullGC40次/天到10天一次的优化过程
通过这一个多月的努力,将FullGC从40次/天优化到近10天才触发一次,而且YoungGC的时间也减少了一半以上,这么大的优化,有必要记录一下中间的调优过程。对于JVM垃圾回收,之前一直都是处于理论
JVM源码分析之不可控的堆外内存
概述 之前写过篇文章,关于堆外内存的,[JVM源码分析之堆外内存完全解读],里面重点讲了DirectByteBuffer的原理,但是今天碰到一个比较奇怪的问题,在设
关于数组动态扩容导致频繁GC的问题,我还有话说
概述 通过上篇[抓了一个导致频繁GC的鬼--数组动态扩容](https://heapdump.cn/article/123281)关于数组动态扩容导致频繁GC的文章或许GET到了这么一些点 -
注意:两个会导致druid性能下降10倍的参数
druid:阿里巴巴开源的为监控而生的数据库连接池。你看,官方都没有说是高性能数据库连接池,因为,在性能方面,HikariCP会说:我不是针对谁,论性能,在坐的各个数据库连接池都是渣渣。Github
记一次微服务耗时毛刺排查
前段时间的某天,注意到一个服务的平均耗时出现了如下图的毛刺现象。注意到毛刺出现极其规律,每30分钟出现一个毛刺。考虑到这种规律性,并结合服务的流量较小(20 QPS)推测,可能是某个定时请求的接口进行
网络IO 实战篇 :Java电商系统:重大事故!IO问题引发线上20台机器同时崩溃
几年前的一个下午,公司里码农们正在安静地敲着代码,突然很多人的手机同时“哔哔”地响了起来。本来以为发工资了,都挺高兴!打开一看,原来是告警短信 故障回顾告警提示“线程数过多,超出阈值”,“CPU空闲率
spring boot 引起的 “堆外内存泄漏”
背景组内一个项目最近一直报swap区域使用过高异常,笔者被叫去帮忙查看原因。发现配置的4G堆内内存,但是实际使用的物理内存高达7G,确实有点不正常,JVM参数配置是:```java-XX:Metasp
从CMS到G1:LinkedIn个人主页调优实战
LinkedIn中的个人主页是访问量最多的页面之一,它允许其他人访问你的个人主页,从而了解你的专业技能,经验和兴趣等: 所以,确保用户访问主页时以最快的速度返回是非常重要的。这篇文章,将谈论Li
不起眼,但是足以让你有收获的JVM内存分析案例
分析 这个问题说白了,就是说有些int[]对象不知道是哪里来的,于是我拿他的例子跑了跑,好像还真有这么回事。点该 dump 文件详情,查看相关的 int[] 数组,点该对象的“被引用对象”,发现所
实战:OOM 后我如何分析解决的
现在很多面试官都会关心你是否有过解决内存泄漏的问题,是否有过JVM的调优经验。你如果没有经历过,该如何回答呢?希望下文对你有所帮助。 背景前不久,上线了一个新项目,这个项目是一个压测系统,可以简单的看
一次百万长连接压测 Nginx OOM 的问题排查分析
在最近的一次百万长连接压测中,32C 128G 的四台 Nginx 频繁出现 OOM,出现问题时的内存监控如下所示。排查的过程记录如下。 现象描述这是一个 websocket 百万长连接收发消息的压测
深入理解 G1 的 GC 日志
本文基于1.8.0_201-b09对G1的GC日志进行分析。G1 模式下总计有 3 中日志级别,分别被称为:fine,finer,finest。- fine:fine模式打开方式是-verbose:g
分析和解决JAVA 内存泄露的实战例子
这几天,一直在为Java的“内存泄露”问题纠结。Java应用程序占用的内存在不断的、有规律的上涨,最终超过了监控阈值。福尔摩 斯不得不出手了! 分析内存泄露的一般步骤 如果发现Java应用程序占用的内
不可逆的类初始化过程
类的加载过程说复杂很复杂,说简单也简单,说复杂是因为细节很多,比如说今天要说的这个,可能很多人都不了解;说简单,大致都知道类加载有这么几个阶段,loaded-linked-initialized,为了
JVM源码分析之栈溢出完全解读
概述之所以想写这篇文章,其实是因为最近有不少系统出现了栈溢出导致进程crash的问题,并且很隐蔽,根本原因还得借助coredump才能分析出来,于是想从JVM实现的角度来全面分析下栈溢出的这类问题,或
记一次JVM堆外内存泄露Bug的查找
前言JVM的堆外内存泄露的定位一直是个比较棘手的问题。此次的Bug查找从堆内内存的泄露反推出堆外内存,同时对物理内存的使用做了定量的分析,从而实锤了Bug的源头。笔者将此Bug分析的过程写成博客,以飨
改善 Kubernetes 上的 JVM 预热问题
JVM 预热是一个非常头疼而又难解决的问题。本文讨论了在运行在 Kubernetes 集群中的 Java 服务如何解决 JVM 预热问题的一些方法和经验。 作者:Vikas Kumar 翻译:Bach
JVM参数系列 - 学习JVM参数前必须了解的
可以把JVM想象成相机,JVM参数想象成光圈大小,快门速度之类的参数值,这些参数对程序的运行会影响挺大。
频繁操作本地缓存导致YGC耗时过长
某天,某位群友在JVM讨论群里发来一张GC log的图片。其中主要的问题是YGC过长,每次耗时约为200ms。使用的JVM参数如下:```java-Xmn2048m -Xms4096m -Xmx409
OutOfMemoryError之unable to create new native thread原因分析及6种解决方案
java.lang.OutOfMemoryError:unable to create new native thread 是比较常见的一种异常,表示应用程序无法创建新的线程。产生该异常,总体上可总结
JVM Code Cache空间不足,导致服务性能变慢
有业务反馈,线上一个应用运行了一段时间之后,在高峰期之后,突然发现处理能力下降,接口的响应时间变长,但是看Cat上的GC数据,一切都很正常。通过跳板机上机器查看日志,发现一段平时很少见到的日志:```
AsyncGetCallTrace 源码深度剖析
前言 AsyncGetCallTrace 是由 OracleJDK/OpenJDK 内部提供的一个函数,该函数可以在 JVM 未进入 safepoint 时正常获取到当前线程的调用栈(换句话说,使用
又抓了一个导致频繁GC的鬼--数组动态扩容
概述 本周有个同事过来咨询一个比较诡异的gc问题,大概现象是,系统一直在做cms gc,但是老生代一直不降下去,但是执行一次jmap -histo:live之后,也就是主动触发一次full gc之后
GC一些长时间停顿问题排查及解决办法
对于许多企业级应用,尤其是OLTP应用来说,长暂停很可能导致服务超时,而对这些运行在JVM上的应用来说,垃圾回收(GC)可能是长暂停最主要的原因。本文将描述一些可能碰到GC长暂停的不同场景,以及说明我
ZGC什么时候会进行垃圾回收
以往的一些GC算法,比如CMS、G1,均采用分代的思想对堆内存进行划分,对应的GC行为也可以分为Young GC、Old GC 和 FGC。但是在ZGC算法中,并没有分代的概念,所以就不存在Young
XPocket插件jstack_x助力线程问题排查
在程序开发过程中,开发人员通常会遇到许多线上问题,这些问题可能是代码Bug导致的,也可能是性能问题引起的。这些线上问题都会通过CPU飙升、GC频繁、抛出OOM异常等情况表现出来,这些问题的根因很可能是
使用NMT和pmap解决JVM资源泄漏问题
编者按:笔者使用JDK自带的内存跟踪工具NMT和Linux自带的pmap解决了一个非常典型的资源泄漏问题。这个资源泄漏是由于Java程序员不正确的使用Java API导致的,使用Files.list打
一次 JVM 进程退出分析
最近我们在测试把 APM 平台迁移到 ES APM,有同学反馈了一个有意思的现象,部署在 docker 中 jar 包项目,在新版 APM 里进程启动完就退出了,被 k8s 中无限重启。这篇文章写了一
不起眼,但是足以让你收获的JVM内存案例
今天的这个案例我觉得应该会让你涨姿势吧,不管你对JVM有多熟悉,看到这篇文章,应该还是会有点小惊讶的,不过我觉得这个案例我分享出来,是想表达不管多么奇怪的现象请一定要追究下去,会让你慢慢变得强大起来,
一次线上 xxl-job 服务异常排查分析
问题描述某天收到频繁的告警邮件,定时任务调度失败,查看 xxl-job 的执行器列表是空的,但是服务又显示健康,查看历史任务执行记录发现执行器是依次递减,由于是线上服务,只能先重启,然后线程日志也没有
JVM Bug:多个线程持有一把锁?
JVM线程dump Bug描述 在JAVA语言中,当同步块(`Synchronized`)被多个线程并发访问时,JVM中会采用基于互斥实现的重量级锁。JVM最多只允许一个线程持有这把锁,如果其它线
深(浅)入(出)剖析G1(Garbage First)
Java从JDK7U9开始支持G1(正式发布),所以,如果要使用G1的话,你的Java版本应该是JDK7U9或者更新的版本。不过,强烈建议JDK8才使用G1,而且最好是JDK8的最新版本,因为在JDK
聊一个可能有惊喜的System GC知识点
问题概述因为工作关系有挺长时间没和大家分享东西了,也经常看到有同学在后台给我留言说好久没更新了,实在抱歉,不过接下来会有比较多的分享给到大家,下周我们会在PerfMa的社区(https://club.
深入理解堆外内存 Metaspace
在之前介绍的分代垃圾回收算法中,我们一直有一个永久代存在,叫 PermGen,内存上它是挨着堆的。为了垃圾回收方便,HotSpot 在永久代上一直是使用老年代的垃圾回收算法。永久代主要存放以下数据:-
Java 应用性能调优的一些实践
Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。尤其是在“糙快猛”的互联网开发模式大行其道的今天,随着系统访问量的日益增加和
一次真实的线上OOM问题定位
概述近日,负责的一系统生产环境上出现了OutOfMemoryError,伴随着这个问题随之而来的是一堆Full GC, CPU 百分之百,频繁宕机重启等问题,严重影响业务的推广及使用,此类问题一般处理
JVM源码分析之警惕存在内存泄漏风险的FinalReference(增强版)
概述JAVA对象引用体系除了强引用之外,出于对性能、可扩展性等方面考虑还特地实现了四种其他引用:SoftReference、WeakReference、PhantomReference、FinalRe
JVM 发生 OOM 的 8 种原因、及解决办法
小A:xx服务又宕机了小B:歪日,咋搞的,登上去看看咋回事小A:又OOM了,不知道哪个写的代码,一坨一样。撸Java的同学,多多少少会碰到内存溢出(OOM)的场景,但造成OOM的原因却是多种多样。 堆
JVM源码分析之JDK8下的僵尸(无法回收)类加载器
概述这篇文章基于最近在排查的一个问题,花了我们团队不少时间来排查这个问题,现象是有一些类加载器是作为key放到WeakHashMap里的,但是经历过多次full gc之后,依然坚挺地存在内存里,但是从
高并发下的 AtomicLong 性能有点差!
如果让你实现一个计数器,有点经验的同学可以很快的想到使用AtomicInteger或者AtomicLong进行简单的封装。因为计数器操作涉及到内存的可见性和线程之间的竞争,而Atomic的实现完美的屏
一个 JVM 参数引发的频繁 CMS GC
前言了解 CMS GC 的同学,一定知道 -XX:CMSScavengeBeforeRemark 参数,它是用来开启或关闭在 CMS-remark 阶段之前的清除(Young GC)尝试。大家都知道C
Redis client链接池配置不当引起的频繁full gc
现象笔者负责的一个RPC服务就是简单的从Redis Cluster中读取数据,然后返回给上游。理论上该服务的对象大部分都应该是朝生夕死的,但是笔者查看gc log 的时候发现 age =2 的对象还真
FullGC实战:业务小姐姐查看图片时一直在转圈圈
业务小姐姐说图片访问不了,我开始慌了:看到业务小姐姐发的这个图片,你说能不慌嘛?但是再慌也要排查问题呀!对于这种前端响应不过来的问题,首先就用浏览器的F12看看接口响应速度(获取图片地址的接口)从而确
Docker对JVM一些限制的研究
首先说一个老生常谈的限制:我们在对Docker中的Java应用使用诸如jmap等命令时常常会报错:`Can't attach to the process: ptrace(PTRACE_ATTACH,
Java OOM 实战篇:应用故障之Java heap space 堆溢出实战
以下是用于测试OOM的测试代码:```javapublic class HeapMemUseTest { public static void main(String[] args) {
一次年轻代GC长暂停问题的解决与思考
问题描述公司某规则引擎系统,在每次发版启动会手动预热,预热完成当流量切进来之后会偶发的出现一次长达1-2秒的年轻代GC(流量并不大,并且LB下的每一台服务都会出现该情况)在这次长暂停之后,每一次的年轻
GC 实战—浮动内存导致的 CPU 过高调优
由于接入的应用越来越多,对系统性能要求越来越高,提高系统的吞吐率,以及提升性能,是我们春节战役期间必须要做的事情。系统的性能优化不单单是对 JVM 的参数调优,也不是某一段代码的改造,而是一个系统的工
fastJson与一起堆内存溢出'血案'
现象- QA同学反映登录不上服务器 排查问题1--日志级别- 查看log,发现玩家登录的时候抛出了一个java.lang.OutOfMemoryError - 大概代码是向Redis序列化一个Pla
为什么容器内存占用居高不下,频频 OOM(续)
在之前的文章《[为什么容器内存占用居高不下,频频 OOM](https://heapdump.cn/article/1589003)》 中,我根据现状进行了分析和说明,收到了很多读者的建议和疑
由「Metaspace容量不足触发CMS GC」从而引发的思考
某天早上,毛老师在群里问「cat 上怎么看 gc」。看到有 GC 的问题,立马做出小鸡搓手状,之后毛老师发来一张图。图片展示了老年代内存占用情况:第一个大陡坡是应用发布,老年代内存占比下降,很正常。第
JVM源码分析之自定义类加载器如何拉长YGC
概述本文重点讲述毕玄大师在其公众号上发的一个GC问题一个jstack/jmap等不能用的case,对于毕大师那篇文章,题目上没有提到GC的那个问题,不过进入到文章里可以看到,既然文章提到了jstack
JVM菜鸟进阶高手之路三Tomcat调优
因为每个链路都会对其性能造成影响,应该是全链路的修改压测(ak大神经常说全链路!)。本次基本就是局域网,所以并没有怎么优化,其实也应该考虑进去的。 Linux系统参数层面的修改:修改可打开文件数和用户
JVM 源码解读之 CMS 何时会进行 Full GC
前言 本文内容是基于 JDK 8在文章[ JVM 源码解读之 CMS GC 触发条件](https://heapdump.cn/article/190389) 中分析了 CMS GC 触发的
JVM菜鸟进阶高手之路二MAT工具相关知识解惑
关于MAT工具相关知识解惑MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件。但是比较主流的厂家和格式,例如 Sun, HP, SAP 所采用的 HPROF 二进制堆存储文件,以及 IBM 的
一则OOM死机故障的处理过程
OOM是Out of Memory的简写,也就是内存不足。出现该问题的原因有很多,如程序内存泄漏等。内存泄漏问题可以通过定时地终止和重启有问题的程序来发现和解决。在比较新的Linux内核版本中,有一种
Elasticsearch调优篇-慢查询分析笔记
前言- elasticsearch提供了非常灵活的搜索条件给我们使用,在使用复杂表达式的同时,如果使用不当,可能也会为我们带来了潜在的风险,因为影响查询性能的因素很多很多,这篇笔记主要记录一下慢查询可
一次线上JVM Young GC调优,搞懂了这么多东西!
先说一下基本情况,本次是对线上商品服务的JVM优化。商品服务的访问量非常高,单机QPS在3000左右,线上总共部署了15个商品服务节点。JVM堆内存大小是8G,其中给新生代分配了2G,老年代垃圾回收器
为什么容器内存占用居高不下,频频 OOM
最近我在回顾思考(写 PPT),整理了现状,发现了这个问题存在多时,经过一番波折,最终确定了元凶和相对可行的解决方案,因此分享一下排查历程,希望能够给大家一些借鉴的经验。时间线:- 在上 Kubern
JVM源码分析之Attach机制实现完全解读
Attach是什么在讲这个之前,我们先来点大家都知道的东西,当我们感觉线程一直卡在某个地方,想知道卡在哪里,首先想到的是进行线程dump,而常用的命令是jstack ,我们就可以看到如下线程栈了大家是
JDK11现存性能bug(JDK-8221393)深度解析
这是一篇鸽了很久的博客,因为博客内容和素材早就准备差不多了,但就是一直懒得整理,今天终于下定决心终于整理出来了,这也是这个bug [JDK-8221393](https://bugs.openjdk.
FGC实战:坏代码导致服务频繁FGC无响应问题分析
前些日子小组内安排值班,轮流看顾我们的服务,主要做一些报警邮件处理、Bug 排查、运营 issue 处理的事。工作日还好,无论干什么都要上班的,若是轮到周末,那这一天算是毁了。不知道是公司网络广了就这
依赖包滥用System.gc()导致的频繁Full GC
介绍业务部门的一个同事遇到个奇怪的 Full GC 问题,有个服务迁移到新的应用后,一直频繁 Full GC。新应用机器的配置是 4c 8g,老应用是 4c 4g,老应用 GC 都很正常,并且代码没有
一次诡异的垃圾回收耗时问题排查实践
之前的博文中说过最近在查一个问题,花费了近两个星期,问题算是有了一个小结,是时候总结一下了。排查过程走了很多弯路,由于眼界和知识储备问题,也进入了一些思维误区,希望此问题能以后再查询此类问题时能有所警
踩了一个java命令行参数顺序的坑
前言 这几天线上实例会偶尔报警重启,查了一下问题,偶然发现了一个`java`命令参数顺序的坑。 正文 我线上的启动命令行为: ```sh java -jar app.jar -DcustomArg
导致程序出现OOM的因素,夜深人静的时候,程序OOM异常追踪
作为Java程序员, 除了享受垃圾回收机制带来的便利外, 还深受OOM(Out Of Memory)的困惑和折磨。 堆溢出(heap)编写如下例程:```javapublic static void
JVM 源码解读之 CMS GC 触发条件
前言 经常有同学会问,为啥我的应用 Old Gen 的使用占比没达到 CMSInitiatingOccupancyFraction 参数配置的阈值,就触发了 CMS GC,表示很莫名奇妙,不知道问题出
大量类加载器创建导致诡异FullGC
现象最近接手了一个同事的项目,某一天接口的响应耗时突然增加了很多,由几十ms 增加到了几十秒。首先查看机器上的日志,有调用第三方接口超时,查询数据库超时。立马查看第三方接口监控和数据库监控,一切正常。
FGC实战:如何用Idea揪出开源组件调用System.gc导致频繁FGC
某天上午收到最近发布的一个服务频繁FGC的告警,这个服务只是给公司内部相关人员使用的,并非给互联网用户提供服务的系统。而且功能也比较简单,就是查看一些统计信息、报表数据、数据导出Excel等,访问量非
震惊!线上四台机器同一时间全部 OOM,到底发生了什么?
案发现场昨天晚上突然短信收到 APM (即 Application Performance Management 的简称,我们内部自己搭建了这样一套系统来对应用的性能、可靠性进行线上的监控和预警的一种
操作系统
内存问题探微
这篇文章是我在公司 TechDay 上分享的内容的文字实录版,本来不想写这么一篇冗长的文章,因为有不少的同学问是否能写一篇相关的文字版,本来没有的也就有了。说起来这是我第二次在 TechDay 上做的
JVM源码分析之System.currentTimeMillis及nanoTime原理详解
概述上周有同事问了我一个现象很诡异的问题,说JDK7和JDK8下的```System.nanoTime()```输出完全不一样,而且差距还非常大,是不是两个版本里的实现不一样,之前我也没注意过这个细节
消失的Java进程-Linux OOM Killer
在一台虚拟机上执行docker java应用,每隔一段时间就会出现java进程消失、而且没有任何jvm error log的情况。略一寻思,应该是遇到网上常说的Linux OOM的情况:虚拟机10G,
谈谈JVM的垃圾回收器
JVM的GC经过多年的发展,大家对Minor GC、major GC的理解并不完全一致,所以我不打算在本文中使用这个概念。我把GC大概分为一下4类:1. Young GC:只是负责回收年轻代对象的GC
刨根问底——记一次 OOM 试验造成的电脑雪崩引发的思考
问题初现----电脑雪崩在写「垃圾回收-实战篇」时,按书中的一个例子做了一次实验,我觉得涉及的知识点挺多的,所以单独拎出来与大家共享一下,相信大家看完肯定有收获。 画外音:尽信书不如无书,对每一个例子
jvm堆内存溢出后,其他线程是否可继续工作
背景之前网上出现一个面试题:“一个线程OOM后,其他线程还能运行吗?”。我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。由于题
记一次简单的 JVM 调优
背景最近对负责的项目进行了一次性能优化,其中包括对 JVM 参数的调整,算是进行了一次简单的 JVM 调优,JVM 参数调整之后,服务的整体性能有 5% 左右的提升,还算不错。先介绍一下项目的基本情况
Young GC 突刺排查又让我涨知识了!
现象下图是每分钟yong gc 所消耗的时间,没有规律的突刺。年轻代gc 使用的是 ParNew 并发收集。下图是每分钟yong gc 的次数,可以看出每分钟gc的频率比较稳定。每分钟gc次数没有变化
OOM异常会导致JVM退出吗?
问题来源一次生产事故,由于一次性从数据库查询过多数据导致线程 OOM:Java heap space 异常(千万级表,JVM堆内存2G),但是在线程OOM发生时,java进程却没有立即挂掉。不符合所谓
JVM源码分析之SystemGC完全解读
概述 JVM的GC一般情况下是JVM本身根据一定的条件触发的,不过我们还是可以做一些人为的触发,比如通过jvmti做强制GC,通过System.gc触发,还可以通过jmap来触发等,针对每个场景其实我
谈谈项目中主动full gc的一些问题
背景前一段时间在公司一个技术群里,有人在问“有人在线上使用32G内存的服务”。我司线上内存标准配置都是8G的。我就问了一下使用32G内存碰到了啥问题。他的关注点在于一次full gc 时间的长短上。他
JVM GC 之「AdaptiveSizePolicy」实战
AdaptiveSizePolicy简介AdaptiveSizePolicy(自适应大小策略) 是 JVM GC Ergonomics(自适应调节策略) 的一部分。如果开启 AdaptiveSizeP
记一次Jvm参数调优实战
案例一```javapublic class test1 { private static final int _1MB = 1024 1024; public static void
G1垃圾回收源码分析(一)
G1 垃圾回收(一) 垃圾回收算法标记清除,标记复制,标记-清除-压缩,- 标记清除 标记清除呢就是比较直观的理解了,内存中当引用不可达之后这一块内存就要被释放出来,,当然我们知道java中的对象
强如 Disruptor 也发生内存溢出?
前言```OutOfMemoryError ```问题相信很多朋友都遇到过,相对于常见的业务异常(数组越界、空指针等)来说这类问题是很难定位和解决的。本文以最近碰到的一次线上内存溢出的定位、解决问题的
导致程序出现OOM的因素,夜深人静的时候,程序OOM异常追踪
作为Java程序员, 除了享受垃圾回收机制带来的便利外, 还深受OOM(Out Of Memory)的困惑和折磨.先来看下java的内存分布 堆溢出(heap)编写如下例程:```javapublic
JVM CPU Profiler技术原理及源码深度解析
引言研发人员在遇到线上报警或需要优化系统性能时,常常需要分析程序运行行为和性能瓶颈。Profiling技术是一种在应用运行时收集程序相关信息的动态分析手段,常用的JVM Profiler可以从多个方面
SafePoint 与 Stop The World 全解(基于OpenJDK 11版本)
在分析线上 JVM 性能问题的时候,我们可能会碰到下面这些场景:1.GC 本身没有花多长时间,但是 JVM 暂停了很久,例如下面:2.JVM 没有 GC,但是程序暂停了很久,而且这种情况时不时就出现。
JVM源码分析之临门一脚的OutOfMemoryError完全解读
概述OutOfMemoryError,说的是java.lang.OutOfMemoryError,是JDK里自带的异常,顾名思义,说的就是内存溢出,当我们的系统内存严重不足的时候就会抛出这个异常(PS
一次 HashSet 所引起的并发问题
背景上午刚到公司,准备开始一天的摸鱼之旅时突然收到了一封监控中心的邮件。心中暗道不好,因为监控系统从来不会告诉我应用完美无 bug,其实系统挺猥琐。打开邮件一看,果然告知我有一个应用的线程池队列达到阈
类初始化死锁导致线程被打爆!打爆!爆!
概述之前写过关于类加载死锁的文章,[消失的死锁](https://heapdump.cn/article/280601),说的是类加载过程中发生的死锁,我们从线程dump里完全看不出死锁的迹象
如何通过反射获得方法的真实参数名(以及扩展研究)
前段时间,在做一个小的工程时,遇到了需要通过反射获得方法真实参数名的场景,在这里我遇到了一些小小的问题,后来在部门老大的指导下,我解决了这个问题。通过解决这个问题,附带着我了解到了很多新的知识,我觉得
深入汇编指令理解Java关键字volatile
volatile是什么volatile关键字是Java提供的一种轻量级同步机制。它能够保证可见性和有序性,但是不能保证原子性 可见性对于volatile的可见性,先看看这段代码的执行<div alig
实践项目中的JVM调优
背景有个项目可以实时对应用的健康情况进行监控、分析、预警。如下图展示一段时间内应用“JVM监控”:从这个视图中可以看出几个关键点:(1)标号1中展示此时间段内FullGC次数、YoungGC次数;(2
G1垃圾回收源码分析(三)
新生代之前叙述了G1的分区和Rset,这一次来关注一下G1新生代在发生GC的主要处理方式。G1的新生代的分区个数受之前动态计算出得分区的大小影响,如果设置了(MaxNewSize和NewSize)。除
G1垃圾回收源码分析(二)
卡表(CardTable)由于新生代的垃圾收集通常很频繁,如果老年代对象引用了新生代的对象,那么,需要跟踪从老年代到新生代的所有引用,从而避免每次YGC时扫描整个老年代,减少开销。HotSpot 使用
记一次JVM OOM 实战优化
刚接手的服务,正常稳定运行了很长一段时间,在大家伙收拾东西准备回家过年时,突然就抽风了。接口失败率居高不下?看日志!```javaGC overhead limit exceededjava.lang
JVM菜鸟进阶高手之路四如何解决Full GC问题
以为上次问题是rmi的问题就此结束了,但是问题并没有结束,其实本次问题不是rmi问题导致的,但是rmi也的确可能会有sys.gc fullgc问题。
Java 虚拟机进程状态管理工具 jps 失效?吓尿了!
寒冬了,服务器资源也要节约这用。以前,我们一个人可以申请多个机器进行一些分布式的系统部署和测试,包括一些微服务方面的项目我们尽量的模拟多台机器的环境。但是现在,公司为了进一步节约成本开支,把一些机器进
JVM源码分析之不保证顺序的Class.getMethods
概述本文要说的内容是今天公司有个线上系统踩了一个坑,并且貌似还造成了一定的影响,后来系统相关的人定位到了是`java.lang.Class.getMethods`返回的顺序可能不同机器不一样,有问题的
32个问题,学习Java虚拟机的运行时数据区
学习JVM虚拟机是一个比较枯燥无味的过程,刚开始基本是看不懂学不懂,然后就是似懂非懂,最后觉得好像懂了一些,到后来又觉得还是没懂,反正就是懵懵懂懂,过目就忘,一问就卡住,说也说不清,其实说的就是我自己
System.gc() 源码解读
介绍```System.gc()```,大家应该也有所了解,是JDK提供的触发Full GC的一种方式,会触发Full GC,其间会stop the world,对业务影响较大,一般情况下不会直接使用
从一个Young GC变慢的案例来聊聊finalize方法
背景有一次一位同学上线之后,发现Young GC的时间飙升很多,监控如下图:监控显示老代码(04机器)的平均young gc时间之后23ms,而新代码(01机器)为平均时间84ms。上线去查看gc
去哪儿国内酒店稳定性治理实践之缓存治理
背景2019 年 9 月,我们连续遇到几次与缓存相关的故障:1. DBA 运维失误,导致我们存储在 redis 里的核心基础数据被清空。由于无法正常提供报价,出现 ATP(订单量骤降)故障,之后通过定
CMS GC 新生代默认是多大?
问题首先抛个问题给大家,看下面 JVM 参数配置:```java-Xmx2g -Xms2g -XX:+UseConcMarkSweepGC```猜一猜按照这样的 JVM 参数配置,YoungGen(新
再次剖析 “一个 JVM 参数引发的频繁 CMS GC”
前言之前这篇《[一个 JVM 参数引发的频繁 CMS GC](https://heapdump.cn/article/329932)》文章发出之后,反应比较激烈,因为这可能与同学们通常 GC
java内存溢出问题分析过程
背景运维人员反馈一个容器化的java程序每跑一段时间就会出现OOM问题,重启后,间隔大概两天后复现。 问题调查 一、查日志由于是容器化部署的程序,登上主机后使用docker logs Containe
关于JConsole里的“执行GC”按钮与System.gc()的关系
前言JConsole里的可以执行的gc这里的GC是立即执行,还是与代码里写System.gc()一样,是由jvm决定什么时候来执行的?执行的是minor gc,还是full gc,还是根据特定区域执行
简单的 HTTP 调用,为什么时延这么大?
背景最近项目测试遇到个奇怪的现象,在测试环境通过 Apache HttpClient 调用后端的 HTTP 服务,平均耗时居然接近 39.2ms。可能你乍一看觉得这不是很正常吗,有什么好奇怪的?其实不
JVM菜鸟进阶高手之路五之eden survivor分配问题
问题这个Xmn设置为1G,,我用jmap -heap 看,这个Eden From To怎么不是一个整8:1:1的关系呢?我看内存分配还是没变,我Xmn1g,感觉From、To应该都是102.4M才对,
从实际案例聊聊Java应用的GC优化
当Java程序性能达不到既定目标,且其他优化手段都已经穷尽时,通常需要调整垃圾回收器来进一步提高性能,称为GC优化。但GC算法复杂,影响GC性能的参数众多,且参数调整又依赖于应用各自的特点,这些因素很
GC日志中,Metaspace的这几个参数分得清吗?
在GC日志中,Metaspace这一行的 used ,capacity ,committed ,reserved 具体都代表什么?```JAVAHeapPSYoungGen total 10
认识HotSpot虚拟机第1篇-在Ubuntu 16.04上编译OpenJDK8的源代码(配视频)
本文将详细介绍在Ubuntu16.04 LTS上对OpenJDK8进行编译,为了方便大家快速搭建起OpenJDK8的调试开发环境,我还录制了对应的视频放到了B站上,大家可以参考。视频地址:[https
内存溢出及解决方案
什么是内存溢出 JVM运行过程中,程序不断的申请内存空间用于保存运行时数据,当程序申请的内存空间系统无法满足时,就会抛出内存溢出错误。内存溢出发生的区域以及相应的解决方案都不相同,下面我们逐一分析内
YGC前后新生代变大?
问题描述我们都知道gc是为了释放内存,但是你是否碰到过ygc前后新生代反增不减的情况呢?gc日志效果类似下面的:```java2016-05-18T15:06:13.011+0800: [GC [Pa
被虐后,分享一点点JVM调优原理相关的知识和经验
本文只介绍一些原理和思路的内容,希望对你与所帮助!‍- 先了解原理,然后在进行调优。一定要记住的是任何的调优都不是一蹴而就,不要指望改动一个参数就达到调优的目的,也不要仅仅改动了一个参数,就认为是做了
生产环境JVM内存溢出案例分析
如果我们所在公司的业务量比较大,在生产环境经常会出现JVM内存溢出的现象,那我们该如何快速响应,快速定位,快速恢复问题呢?本文将通过一个线上环境JVM内存溢出的案例向大家介绍一下处理思路与分析方法。案
Hotspot GC研发工程师也许漏掉了一块逻辑
概述今天要说的这个问题,是我经常面试问的一个问题,只是和我之前排查过的场景有些区别,属于另外一种情况。也许我这里讲了这个之后,会成为不少公司JVM必问之题,所以本文还是值得大家好好看看的,相信也会让你
一次full gc的排查经历
问题描述1月22日准备发布设备指纹新版本迭代过程中,在预发环境进行采集请求的压测发现了个现象,监控中的RT存在规律的尖点。接着又尝试master代码,发现不存在这个问题,那基本确认是新代码引入的问题了
服务刚启动就 Old GC,要闹哪样?
背景最近有个同学说他的服务刚启动就收到两次 Full GC 告警, 按道理来说刚启动,对象应该不会太多,为啥会触发 Full GC 呢?带着疑问,我们还是先看看日志吧,毕竟日志的信息更多。 日志可以看
为什么GC 异常,大家喜欢让Swap背锅呢
背景在公司内部技术群里,经常有人时不时的问到服务某次GC时间突然很高,有什么办法排查。基本上每次都会有人怀疑会不会Swap导致的,先看看Swap,如果真的使用了Swap区域,基本上就会让Swap区域背
一个JDK线程池BUG引发的GC机制思考
问题描述前几天在帮同事排查生产一个线上偶发的线程池错误逻辑很简单,线程池执行了一个带结果的异步任务。但是最近有偶发的报错:```javajava.util.concurrent.RejectedExe
一个fullgc引发的流血事件
本文正在参加「Java应用线上问题排查经验/工具分享」活动先点赞再看,养成好习惯背景 全国最大的短信平台,大家都用过我们的产品。数据量比较大,最多时候一天近7亿条短信。由于我们技术不很扎实,生产问题就
记录一次jvm调优过程
查看gc情况结果:服务启动时长是1天,进行了3240左右次minorGC,一共使用时间80s左右。也就是一次minirGC时间是0.02s,FGC是一次,时间是2.2s,fullGC时间过长,需要优化
一次“诡异”的JVM缓存加载问题排查
项目中使用@Scheduled注解(Spring注解)来定时(每隔五分钟)刷新JVM缓存。但测试环境和线上环境出现不一样的效果(如下图),测试环境每隔5分钟刷新一次,而线上环境刷新的时间间隔远远超过5
PhantomReference导致CMS GC耗时严重
介绍GC优化关键是找到优化的点,如果明确GC过程中耗时的阶段在哪里,优化起来应该也就不难了。这篇文章主要讲述最近一次CMS GC优化过程,是一次分享,也是一次总结。闲话少说,我们开始吧。 现象上图很明
Java中,那些关于String和字符串常量池你不得不知道的东西
老套的笔试题在一些老套的笔试题中,会要你判断s1==s2为false还是true,s1.equals(s2)为false还是true。```javaString s1 = new String("xy
JVM菜鸟进阶高手之路六OLAP系统垃圾回收器选择
GC 日志问题查看docker环境的gc日志,发现是下面这种情况,很奇怪,一直怀疑是docker环境那里是否有点问题,并没有怀疑配置,之前物理机上面的gc日志都是正常那种。表示很奇怪,后来飞哥告诉我,
一个 println 竟然比 volatile 还好使?
先点赞再看,养成好习惯前两天一个小伙伴突然找我求助,说准备换个坑,最近在系统学习多线程知识,但遇到了一个刷新认知的问题…… 小伙伴:Effective JAVA 里的并发章节里,有一段关于可见性的描述
从X86指令深扒JVM的位移操作
概述之所以会写这个,主要是因为最近做的一个项目碰到了一个移位的问题,因为位移操作溢出导致结果不准确,本来可以点到为止,问题也能很快解决,但是不痛不痒的感觉着实让人不爽,于是深扒了下个中细节,直到看到I
没有发生GC也进入了安全点?这段关于安全点的JVM源码有点意思!
文末 JVM 思维导图,有需要的自取熟知并发编程的你认为下面这段代码的执行结果是怎么样的?我如果说,执行流程是:1. t1 线程和 t2 线程一直执行 num 的累加操作2. 主线程睡眠 1 秒,1
国内酒店:通过架构改进,我们计划优化掉300+台服务器
背景 线上问题回顾2019年8月某天,那时我刚入职还不到一个月,遇到一个特殊的线上问题:某报价应用个别机器连续FGC不停(准确的说是FGC几乎没任何效果),这些机器重启后不久继续开始不停的FGC。当时
一起 fastjson 和 Spring-Mongo 联合作妖的类卸载事故排查
问题背景有同学反馈,在自己的业务中调用 groovy 脚本动态生成一些 class 的时候,出现了类无法卸载的现象,下图来自你假笨大神 PerfMa 公司 的 XElephant 「 https://memory.console.heapdump.cn/ 」如果想离线分析也可以用 JPro
Java 动态调试技术原理及实践
动态调试要解决的问题断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径。但断点调试会在断点位置停顿,使得整个应用停止响应。在线上停顿应用是致命的,动态调
内存迟迟下不去,可能你就差一个GC.Collect
背景我们有一家top级的淘品牌店铺,为了后续的加速计算,在程序启动的时候灌入她家的核心数据到内存中,灌入完成后内存高达100G,虽然云上的机器内存有256G,然被这么划掉一半看着还是有一点心疼的,可怜
「每日五分钟,玩转JVM」:两种算法
前言上篇文章,我们了解了GC 的相关概念,这篇文章我们通过两个算法来了解如何去确定堆中的对象实例哪些是我们需要去回收的垃圾对象。 引用计数算法引用计数法的原理很简单,就是在对象中维护一个计数器,当有一
使用google perf工具来排查堆外内存占用
作者:KL原文链接:https://qsli.github.io/2017/12/02/google-perf-tools/转载已获授权线上机器内存不足,经常被系统oom killer干掉。如果tom
深入理解JAVA虚拟机——类加载
概述本文基于JDK8分析Java类的加载过程以及双亲委派模型的实现原理。 什么是JVM毫无疑问,Java一直是企业应用程序的领先的编程语言,我认为这主要是受益于Java虚拟机(JVM)的成熟。JVM已
豆列:从表到里学习JVM实现
在社会化分工、软件行业细分专业化的趋势下,会真的参与到底层系统实现的人肯定是越来越少(比例上说)。真的会参与到JVM实现的人肯定是少数。但如果您对JVM是如何实现的有兴趣、充满好奇,却苦于没有足够系统
一次 Young GC 的优化实践(FinalReference 相关)
前言博客已经好久没有更新了,主要原因是 18 年下半年工作比较忙,另外也没有比较有意思的题材,所以迟迟没有更新。此篇是 18 年底的微信上的某同学提供的一个 Young GC 问题案例,找我帮忙解决。
一次超诡异的FGC,这个原因找了好久!
正撸着代码,公司内的聊天工具弹出一条信息: “狼哥,我这个机器总是频繁FGC...” 我赶紧打开对话框,机智的回复一个表情 然后继续默默撸码。 随后,小伙伴砸了一段GC日志过来 ```java
我司基础组件更新本地缓存策略问题导致young gc时间升高
背景有次想研究一下服务QPS和young gc的时间的关系。假如服务对外提供的接口的平均响应时间是1s,那么最坏情况下该请求用到的对象就应该存活1s(为什么是最坏,因为很多中间变量不需要这么存活这么久
记一次GC频繁且间隔较长解决实战总结
1.背景XX大数据项目,进行高并发且长时间的压测验证系统稳定性的表现。2.异常问题压测中发现,探针监控到应用服务器集群内存消耗达到85%左右,且压测结束后内存不释放。3.问题定位集群中的应用服务器逐一
年轻代频繁ParNew GC,导致http服务rt飙高
背景介绍某日下午大约四点多,接到合作方消息,线上环境,我这边维护的某http服务突然大量超时(对方超时时间设置为300ms),我迅速到鹰眼平台开启采样,发现该服务平均QPS到了120左右,平均RT在2
慌了!LinkedHashMap和hashTable的Entry居然有500w之多,还无法回收
故障介绍某一日早上七点,我还在睡梦之中,8点醒来发现运维群内有人at。一看说是用户服务的一个节点挂掉了。然后大概原因是因为OOM,运维还在群里发了一个jstack 的栈dump文件,未必是事故发生时的
PhantomReference? 虚引用? OOM?
背景关于各种引用参考https://www.geeksforgeeks.org/types-references-java/在我之前认知中,虚引用除了自身对象占用内存外,其引用对象referent在不
借HSDB来探索HotSpot VM的运行时数据
有人问了个小问题,说:```public class Test { static Test2 t1 = new Test2(); Test2 t2 = new Tes
Java语言
Unsafe那些事
简介Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操
如何降低young gc时间
基础知识young gc 主要采用的是copying GC算法;copying GC算法主要有以下两个步骤:1. Root Scanning2. Object Copycopying Gc的执行过程大
并发垃圾收集器(CMS)为什么没有采用标记-整理算法来实现?
并发垃圾收集器(CMS)为什么没有采用标记整理-算法来实现,而是采用的标记-清除算法?分代式GC里,年老代常用mark-sweep;或者是mark-sweep/mark-compact的混合方式,一般
认识HotSpot虚拟机第2篇-调试HotSpot源代码(配视频)
本文将详细介绍在Ubuntu16.04 LTS上对OpenJDK8进行编译,为了方便大家快速搭建起OpenJDK8的调试开发环境,我还录制了对应的视频放到了B站上,大家可以参考。 视频地址:[http
全网最硬核 JVM TLAB 分析(上)
1. 观前提醒本期内容比较硬核,非常全面,涉及到了设计思想到实现原理以及源码,并且还给出了相应的日志以及监控方式,如果有不清楚或者有疑问的地方,欢迎留言。其中涉及到的设计思想主要为个人理解,实现原理以
探底分析Java原子类CAS的实现原理—从HotSpot源码到CPU指令cmpxchg
在Java的java.util.concurrent.atomic包中,提供了许多原子类。这些原子类,主要都是依赖于底层的CAS机制来实现内部值的原子更新操作。 AtomicInteger源码以下为J
Shenandoah GC:一个来自OpenJDK12的全新并发压缩垃圾回收器
是不是才听说了JDK11的ZGC,并且还没搞懂?不好意思,OpenJDK12马不停蹄的带来了Shenandoah GC。 概述JDK12新增的一个名为Shenandoah的GC算法,它的evacuat
IDEA 的 debug 怎么实现?出于这个好奇心,我越挖越深!
对 Debug 的好奇初学 Java 时,我对 IDEA 的 Debug 非常好奇,不止是它能查看断点的上下文环境,更神奇的是我可以在断点处使用它的 Evaluate 功能直接执行某些命令,进行一些计
Netty堆外内存泄露排查与总结
导读Netty 是一个异步事件驱动的网络通信层框架,用于快速开发高可用高性能的服务端网络框架与客户端程序,它极大地简化了 TCP 和 UDP 套接字服务器等网络编程。Netty 底层基于 JDK 的
新一代垃圾回收器ZGC的探索与实践
ZGC(The Z Garbage Collector)是JDK 11中推出的一款低延迟垃圾回收器,它的设计目标包括:- 停顿时间不超过10ms;- 停顿时间不会随着堆的大小,或者活跃对象的大小而增加
由 JVM Attach API 看跨进程通信中的信号和 Unix 域套接字
在 JDK5 中,开发者只能 JVM 启动时指定一个 javaagent 在 premain 中操作字节码,Instrumentation 也仅限于 main 函数执行前,这样的方式存在一定的局限性。
一次系统性能瓶颈的寻找过程
玩过性能优化的朋友都清楚,性能优化的关键并不在于怎么进行优化,而在于怎么找到当前系统的性能瓶颈。性能优化分为好几个层次,比如系统层次、算法层次、代码层次...JVM 的性能优化被认为是底层优化,门槛较
不重启JVM,替换掉已经加载的类,偷天换日?
在遥远的希艾斯星球爪哇国塞沃城中,两名年轻的程序员正在为一件事情苦恼,程序出问题了,一时看不出问题出在哪里,于是有了以下对话:“Debug一下吧。”“线上机器,没开Debug端口。”“看日志,看看请求
第一次FullGC优化实战
关于FullGC,博主只是在一些书中或者博客中,看别人调优过,今天兴起,亲自在本地调了一把本地的项目:第一步:我首先打开了jvisualvm.exe,在Visual GC 里面发现了今天要讨论的重点:
从源码出发看zgc的技术内幕
笔者经过上次对zgc在不同环境下进行的测试后,发现zgc所带来的提升非常之大。一时间对zgc在生产中使用充满信心,但是在全面使用之前,难免对其几大新特性有一些好奇,比如:染色指针,读屏障,动态regi
小心踩雷,一次Java内存泄漏排查实战
前些日子小组内安排值班,轮流看顾我们的服务,主要做一些报警邮件处理、Bug 排查、运营 issue 处理的事。工作日还好,无论干什么都要上班的,若是轮到周末,那这一天算是毁了。不知道是公司网络广了就这
理解 Linux 的虚拟内存
前言前不久组内又有一次我比较期待的分享:”Linux 的虚拟内存”。是某天晚上加班时,我们讨论虚拟内存的概念时,leader 发现几位同事对虚拟内存认识不清后,特意给这位同学挑选的主题(笑)。我之前了
耗时20多秒的young gc,你见过吗?
开门见山,天下之大,无奇不有,惊讶之余,我们一起探探究竟。首先要会看gc log,一图胜千言↓有个细节很关键,user(用户耗时)+sys(系统耗时) <real(真实耗时)。再来看下,每个耗时的具体
Java OOM 原理篇 : 什么是 Java OOM
明明只是小白、明明只想找份工作、明明没有机会接触到OOM与调优,却被现实逼着要去搞懂JVM、OOM、调优。看完这篇文章,大家能获得:什么是OOM、为什么会发生OOM、哪些区域会发生OOM、JVM进程挂了,会有哪些可能性、生产环境的JVM无响应了,如何快速定位问题、子牙老师给你的一些成熟的调优建议
由多线程内存溢出产生的实战分析
一日凌晨,手机疯狂报警,短信以摧枯拉朽之势瞬间以百条的速度到达,我在睡梦中被惊醒,看到短信的部分内容如下:```javaCaused by: java.lang.OutOfMemoryError: u
升级到Spring 5.3.x之后,GC次数急剧增加,我人傻了
01 问题背景最近我们项目升级到了 Spring Boot 2.4.6 + Spring Cloud 2020.0.x,通过我的另一系列即可看出:[Spring Cloud 升级之路](https:/
首次排查 OOM 实录
前言距离上篇文章更新已经一月有余,之所以一直没更新一是工作最近比较忙,二是感觉产出不了什么对自己和他人有价值的文章。因此这段时间,主要的空闲时间在学习技术和写 GitHub,博客这边就暂时落下了。本篇
认识HotSpot虚拟机第4篇-HotSpot的启动过程
本文将详细介绍HotSpot的启动过程,启动过程涉及到的逻辑比较复杂,细节也比较多,下面我们开始以文章的形式简单介绍一下启动过程。HotSpot通常会通过java.exe或javaw.exe来调用/j
Java虚拟机
JVM 优化踩坑记
本文记录了服务 JVM 优化的过程与思路,有对 JVM GC 原理以及对问题排查方向和工具的介绍,也有走弯路和踩坑,分享出来希望对大家有所帮助。
JAVA应用生产问题排查步骤
JAVA应用生产问题排查步骤 学会这篇文章里面的命令并熟练使用,出去面试就可以说自己有5年工作经验并且精通JVM了。本篇文章中介绍的命令绝对是JAVA程序员平时工作中经常使用的并且必须会的命令,如果你
大量生成字节码导致元空间溢出问题排查
前几天生产环境出现了一个问题,gc日志里面某一个时间段出现了大量的Full GC,而且都是回收元空间内存失败了,最终导致了JVM停止运行,微服务中的某个服务发生了宕机。下面记录下排查该问题的过程。首先
记一次MapReduce的内存溢出
背景:最近使用MapReduce做离线数据清洗,在map段做简单的数据过滤,有经纬度的发送到reduce端,没经纬的过滤掉。reduce端将数据整理出来,按业务模型拼接成字符串写入HDFS。供hive
Java最前沿技术——ZGC
ZGC介绍ZGC(The Z Garbage Collector)是JDK 11中推出的一款追求极致低延迟的实验性质的垃圾收集器,它曾经设计目标包括:- 停顿时间不超过10ms;- 停顿时间不会随着堆
G1之REGION SIZE
说明:JDK7和JDK8的Region划分实现略有不同(差异非常小,且只有-Xmx和-Xms的值不一样才有区别),本篇文章讲解的是JDK8中Region的划分实现。 源码分析G1 Region划分的实
记一次线上服务不可用问题分析
问题描述线上接口服务隔一天就不能访问,重启大法好,只要重启就可以调用,间隔半天又会出现这种情况,由于该服务是mocker代理服务,所以开了443、80、11181等端口,但是只有80端口才会被阻塞,其
没源码也没文档,但我还是解决了线上偶发的长耗时问题
本文正在参加「Java应用线上问题排查经验/工具分享」活动 先点赞再看,养成好习惯 背景公司某个规则引擎系统,主要用来做一些费用计算和业务逻辑核验的功能。不过由于一些不可描述的历史原因,导致该系统没有
使用XPocket插件JConsole排查线上OOM异常案例
XPocket插件JConsole主要用于内存问题的排查,能够对堆中的Eden、Survivor、Old区以及堆外的Metaspace、Code Cache等区域进行观察。我们在使用JConsole时
日常问题排查-调用超时
前言日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材^_^。 Bug现场这次的Bug是大家喜闻乐见的调用超时。即A调用B超过了5s搜索一下日志,发现
全网最硬核 JVM TLAB 分析(下)
1. TLAB 相关 JVM 日志解析 1.1. 准备 Java WhiteBox API首先需要准备好Java WhiteBox API 1.1.1. 什么是 WhiteBox APIWhiteBo
JVM调优实战:解决CMS concurrent-abortable-preclean LongGC的问题
背景 多个业务线的应用出现LongGC告警最近一段时间,经常收到CAT报出来的Long GC告警(配置为大于3秒的为Longgc)。 分析前的一些JVM背景知识回顾 JVM堆内存划分- 新生代(You
JVM 判断对象已死,实践验证GC回收
作者:小傅哥博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 一、前言提升自身价值有多重要?经过了风风雨雨,看过了男男女女。时间经过的岁月就没有永恒不变的
G1-垃圾回收简述(三)
Mixed GC回收流程介绍前面3篇文章,分解了G1的分区(Region),RSet,以及新生代的回收也就是G1-YGC。而G1的混合回收,则是既回收新生代分区也回收部分老年代分区。回收新生代分区的我
认识HotSpot虚拟机第3篇-HotSpot项目结构
之前已经介绍了在Ubuntu 16.04上编译OpenJDK8的源代码和调试HotSpot源代码。这一章将介绍HotSpot项目的目录结构。HotSpot目录下主要由agent、make、src和te
通过一个线上调优例子了解JMC 与 Event 结构与详细配置
查看 JFR 事件的工具 - JMC (Java Mission Control)首先打开 jmc,我们通过 “文件” - “打开文件” 来打开一个 jfr 文件。 由于 JFR 文件里面的数据要全部
内存迟迟下不去,可能你就差一个GC.Collect
一:背景 1. 讲故事 我们有一家top级的淘品牌店铺,为了后续的加速计算,在程序启动的时候灌入她家的核心数据到内存中,灌入完成后内存高达100G,虽然云上的机器内存有256G,然被这么划掉一半看着还
深入分析G1垃圾收集器实现原理
本文先简单介绍了GC开发标中的Tri-color Marking算法,然后介绍了Hotspot VM中的分代垃圾回收器,接深入介绍了G1中的RSet实现细节,SATB实现细节以及G1整体的垃圾回收周期等知识。理论知识对于G1调优是必不可少的,日常业务开发有了本文G1的理论知识已足够。
【全网首发】JVM性能问题的自动分析
由于许多业务开发人员对虚拟机了解很少,所以通常在遇到一些虚拟机性能问题或故障时,不得不临时抱佛脚,现学现用一些调优工具和排查方法,而这也变成为了一个有门槛,需要付出学习成本的事情,基于这个考虑,我们可以做一些简单的性能自动分析程序,直接或辅助用户快速定位一些性能问题。下面就以虚拟机参数,堆转储文件,
JDK 从8升级到11,使用 G1 GC,HBase 性能下降近20%。JDK 到底干了什么
编者按:笔者在 HBase 业务场景中尝试将 JDK 从 8 升级到 11,使用 G1 GC 作为垃圾回收器,但是性能下降 20%。到底是什么导致了性能衰退?又该如何定位解决?本文介绍如果通过使用 J
GC复制存活对象,它内存地址变了么?
前言前些天与一位朋友技术交流,朋友在招人面试时想到一个问题,JVM垃圾回收时,会复制存活的对象到不同的区域。比如从新生代复制到老年代,在此过程中,被复制的对象的地址是否变了呢?对他提出的这个问题很感兴
高并发服务优化篇:从RPC预热转发看服务端性能调优
之前的文章中,我们详细阐述了RPC的调用过程,分析了其耗时组成,为我们日常性能调优提供了理论支持。有兴趣的可以点击《[详解RPC的一次调用过程](https://heapdump.cn/article
ThreadDump堆栈分析
最近在进行一些系统问题追踪分析,顺便翻了翻以前的笔记和书籍,突然发现了以前写的 [ThreadDump分析笔记(一)解读堆栈]([https://www.jianshu.com/p/a4bcb36d3
一次 Java 内存泄漏排查过程,涨姿势
人人都会犯错,但一些错误是如此的荒谬,我想不通怎么会有人犯这种错误。更没想到的是,这种事竟发生在了我们身上。当然,这种东西只有事后才能发现真相。接下来,我将讲述一系列最近在我们一个应用上犯过的这种错误
JVM故障处理工具,使用总结
作者:小傅哥博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 一、前言用都用不到怎么学?没有场景、没有诉求,怎么学习这些似乎用不上知识点。其实最好的方式就
线程池使用不当导致系统崩溃
前几天,发现一台阿里云服务器上的Web服务不可用。远程SSH登录不上,尝试几次登录上去之后,执行命令都显示```java-bash: fork: Cannot allocate memory```一看
空中楼阁之纸上谈兵 我对cms的认识
以下看法均基于jdk8----要说老年代之前,需要知道什么情况下对象进入老年代?1、年轻代中年龄到了的对象,可以进入老年代2、年轻代ygc后,剩余的活跃对象在survivor to区放不下,那么这部分
记一次线上内存过高的问题解决
本文正在参加「Java应用线上问题排查经验/工具分享」活动 背景线上-product-center服务器发现有报警,从报警看出内存占用过高,开始定位问题 解决去有问题的服务器看cpu负载,通过`top
JVM相关 - StackOverflowError 与 OutOfMemoryError
本文基于 Java 15StackOverflowError 与 OutOfMemoryError 是两个老生常谈的 Java 错误。Java 中的虚拟机错误 VirtualMachineError
深入剖析JVM堆外内存的监控与回收
记得那是一个风和日丽的周末,太阳红彤彤,花儿五颜六色,96 年的普哥微信找到我,描述了一个诡异的线上问题:线上程序使用了 NIO FileChannel 的 堆内内存作为缓冲区,读写文件,逻辑可以说相当简单,但根据监控却发现堆外内存飙升,导致了 OutOfMemeory 的异常。
JVM 常见线上问题:CPU100%、内存泄露的问题排查
前言本文会从 Windows、Linux 两个系统来做示例展示,有人会有疑问了:为什么要说 Windows 版的 ? 目前市面上还是有很多 Windows 服务器的,应用于传统行业、政府结构、医疗行业 等等;两个系统下的情况都演示下,有备无患。文中用到了两个工具:Processor Explor
记一次 Netty PR 的提交
有一个热心网友丁师傅提了一个问题,问为什么 netty 源码中,有这样一段代码public final class InternalThreadLocalMap     extends UnpaddedI
java中WAITING状态的线程为啥还会消耗CPU
原文链接:https://juejin.cn/post/6844904001067040781 背景刚刚过去的双十一, 公司订单量又翻了一倍. 就在老板坐在办公室里面偷偷笑的同时,坐在工位上的我们却是
一个 JVM 解释器bug在 AArch64 平台导致应用崩溃的问题分析
编者按:笔者遇到一个非常典型的问题,应用在 X86 正常运行,在 aarch64 上 JVM 就会崩溃。这个典型的 JVM 内部问题。笔者通过分析最终定位到是由于 JVM 中模板解释器代码存在 bug
【全网首发】揭密Java常用性能调优工具的底层实现原理
当Java虚拟机出现故障和性能问题时,我们通常会借助一些业界知名的工具来辅助排查问题。为了能更好的利用这些工具,我们通常需要对这些工具的实现原理有所了解,现有资料在介绍一些性能排查和故障诊断工具时,通常只会围绕这个工具的实现原理展开,例如Eclipse的MAT插件,主要是解读虚拟机的Dump文件。这
g1源码之YoungGC技术细节探究
笔者经过上次研究ZGC的代码之后,感受到了ZGC性能的提升和设计的巧妙,由此知道了ZGC的各种优势。但是现在日常生产中许多应用还是用的JAVA8和G1,作为一个对技术有追求的程序员,不由得产生了看一看
记一次使用VJMap排查频繁YGC的经历
VJMap概述分代版的jmap(新生代,存活区,老生代),是排查内存缓慢泄露,老生代增长过快原因的利器。因为jmap -histo PID 打印的是整个Heap的对象统计信息,而为了定位上面的问题,我
垃圾回收全集之一:什么是垃圾回收?
侧重于 Oracle Hotspot 和 OpenJDK 行为。在其他运行时甚至其他 JVM(例如 jRockit 或 IBM J9)中,本手册中涵盖的某些方面的行为可能有所不同。
最全的JVM堆外内存排查思路
简介JVM堆外内存难排查但经常会出现问题,这可能是目前最全的JVM堆外内存排查思路。之前的文章排版太乱,现在整理重发一下,内容是一样的。通过本文,你应该了解:1、pmap 命令2、gdb 命令3、perf 命令4、内存 RSS、VSZ的区别5、java NMT起因这几天遇到一个比较奇怪的问题
卷向字节码-Java异常到底是怎么被处理的?
你好呀,我是why,你也可以叫我歪歪。比如下面这位读者:他是看了我[《神了!异常信息突然就没了?》](https://mp.weixin.qq.com/s/2A_jhF4a31t8_us8v1zbsQ
Java中利用软引用和弱引用来避免oom
强引用、软引用、弱引用和虚引用的介绍,还有使用方法
Native Memory Tracking 详解(1):基础介绍
我们经常会好奇,我启动了一个 JVM,他到底会占据多大的内存?他的内存都消耗在哪里?为什么 JVM 使用的内存比我设置的 -Xmx 大这么多?我的内存设置参数是否合理?为什么我的 JVM 内存一直缓慢增长?为什么我的 JVM 会被 OOMKiller 等等,这都涉及到 JAVA 虚拟机对内存的一个使
G1源码从写屏障到Rset全面解析
笔者在之前讲解g1 youngGC源码的博客(https://my.oschina.net/u/3645114/blog/5119362)中提到过关于g1写屏障和Rset(记忆集合)等相关知识点,之前
垃圾回收全集之二:Java 中的垃圾收集原理解析
标记-清除(Mark and Sweep)是最经典的垃圾收集算法。将理论用于生产实践时, 会有很多需要优化调整的地方, 以适应具体环境。下面通过一个简单的例子, 让我们一步步记录下来, 看看如何才能保证JVM能安全持续地分配对象。
垃圾回收全集之三:GC 算法基础篇
简要介绍GC的基本原理和相关技术。
从new Class()入手浅看JVM的oop-klass模型
首先讲下Java中一个类创建实例如ClassX x = new ClassX()时在整个JVM(Hotspot)中的大致流程:初始JVM会加载ClassX这个类到perm区,也叫方法区(以前在Hots
HeapDump性能社区Young GC异常问题排查实战案例精选合集
在高并发下,Java程序的GC问题属于很典型的一类问题,带来的影响往往会被进一步放大。不管是「GC频率过快」还是「GC耗时太长」,由于GC期间都存在Stop The World问题,因此很容易导致服务
JVM 输出 GC 日志导致 JVM 卡住,我 TM 人傻了
本系列是 我TM人傻了 系列第七期[捂脸],往期精彩回顾:升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了:https://zhuanlan.zhihu.com/p/397042565这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了:h
使用JDK中自带的JVM分析工具解决内存溢出问题
解决常规的JVM异常时,通常依赖JDK中基础工具即可完成问题的定位,从而进行分析和解决,不过这些需要对基础工具熟练使用才行,而很多JDK自身的能力又是经常被忽略的;
居然还有人找不到native方法,我来告你
大家平时研究Java代码,比如想研究Java线程与操作系统线程之间的关系,是否总是被卡在native方法上。今天我就教大家如何精准定位到Java方法对应的C++代码、如何高效研究Hotspot源码。甚至!教大家如何修改Hotspot源码,拓展反射API,为我所用!
关于缓存一致性协议、MESI、StoreBuffer、InvalidateQueue、内存屏障、Lock指令和JMM的那点事
事情是这样的,一位读者看了我的一篇文章,不认同我文章里面的观点,于是有了下面的交流。可能是我发的那个狗头的表情,让这位读者认为我不尊重他。于是,这位读者一气之下把我删掉了,在删好友之前,还叫我回家种田。
JVM故障分析及性能优化系列之六:JVM Heap Dump(堆转储文件)的生成和MAT的使用
前面的文章详细讲述了分析Thread Dump文件,实际在处理Java内存泄漏问题的时候,还需要分析JVM堆转储文件来进行定位。 JVM Heap Dump(堆转储文件)的生成正如Thread Dum
HeapDump性能社区OOM问题排查实战案例精选合集
内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出,有时候会自
实战:SpringBoot项目优化和JVM调优
项目调优作为一名工程师,项目调优这事,是必须得熟练掌握的事情。 在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行。 在这边有一篇比较好的文章,推荐给大家! SpringBoot项目配置Tomcat和JVM参数 一、修改配置文件关于修改配置文件applicati
垃圾回收全集之四:GC 算法实现篇(一)串行GC
大多数JVM都需要使用两种不同的GC算法 —— 一种用来清理年轻代, 另一种用来清理老年代。
高并发服务优化篇:详解一次由读写锁引起的内存泄漏
JVM相关的异常,一直是一线研发比较头疼的问题。因为对于业务代码,JVM的运行基本算是黑盒,当异常发生时,较难直观的看到和找到问题所在,这也是我们一直要研究其内部逻辑的原因。本篇就由一个近期线上JVM
OopMap看不懂,怎么调优哇
最近正在写三色标记算法,准备实现OopMap,梳理了JVM的OopMap机制。本文会介绍垃圾收集器各个阶段与STW、安全点、OopMap之间的关系、识别数据类型的三种算法、GC如何找到JNI线程创建的对象、哪些场景会生成OopMap记录、生成OopMap记录的几个重要方法、OopMap记录如何理解
JVM NativeMemoryTracking 分析堆外内存泄露
来源:狐狸糊涂https://my.oschina.net/foxty/blog/1934968Native Memory Tracking (NMT) 是Hotspot VM用来分析VM内部内存使用
【全网首发】案例分享-full gc导致k8s pod重启
在之前的记一次k8s pod频繁重启的优化之旅中分享过对于pod频繁重启的一些案例,最近又遇到一例,继续分享出来希望能给大家带来些许收获。
MySQL 驱动中虚引用 GC 耗时优化与源码分析
本文简述了一种优雅解决 MySQL 驱动中虚引用导致 GC 耗时较长问题的解决方法、也根据自己的理解讲述了虚引用的作用、结合 MySQL 驱动的源码描述了虚引用的使用场景,希望对你能有所帮助。
Native Memory Tracking 详解(2):追踪区域分析(一)
上篇文章 Native Memory Tracking 详解(1):基础介绍 中,分享了如何使用NMT,以及NMT内存 & OS内存概念的差异性,本篇将介绍NMT追踪区域的部分内存类型——Java heap、Class、Thread、Code 以及 GC。
Native Memory Tracking 详解(3):追踪区域分析(二)
上篇文章 Native Memory Tracking 详解(2):追踪区域分析(一)&n
在 VS Code 中使用 GraalVM 和 VisualVM 进行性能和内存分析
Jetbrain最近的一项调查显示,大约五分之一的Java开发人员使用了visual vm,这使得它成为生态系统中使用最广泛的性能分析工具。在最近发布的GraalVM 21.2中,我们改进了VS Co
OpenJDK16 ZGC 详细源码分析
ZGC 在 JDK11 中作为实验性功能引入后,已经经过了 5 个版本的演进,目前较之前版本有了较大的变化。本文将分析 ZGC 的设计思想和原理。
HeapDump性能社区Full GC异常问题排查实战案例精选合集
处理过线上问题的同学基本都遇到过系统突然运行缓慢,CPU 100%,以及 Full GC 次数过多的问题。这些问题最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本期小编集合了HeapDump性
HikariCP这波性能优化,太炸裂了!
你好呀,我是why。 不是,这不是我。我还年轻,也比他帅。 这是今天文章的主人公。 他叫做 Brett Wooldridge,你应该是不认识的。 但是我把他的 github 截图给你看看
Java虚拟机
G1算法详解
从最高层看,G1的collector一侧其实就是两个大部分: 全局并发标记(global concurrent marking) 拷贝存活对象(evacuation) 而这两部分可以相对独立的执行。
如果线上遇到了OOM,该如何解决?
OOM 意味着程序存在着漏洞,可能是代码或者 JVM 参数配置引起的。这篇文章和读者聊聊,Java 进程触发了 OOM 后如何排查常说对生产环境保持敬畏之心,快速解决问题也是一种敬畏的表现为什么会 OOMOOM 全称 “Out Of Memory”,表示内存耗尽。
Java虚拟机
谈谈指令重排
这个知识点也是很多人说不清道不明的地方,感觉都知道,说又说不出来。为什么会这样呢?因为这几个字,很容易被当成动词去理解,其实正确的理解是当成名词,即指令重排现象。那什么时候会产生指令重排现象呢?两个阶段:1、编译期;2、运行期。
如何干掉OOM,看这篇就够了!
前言随着项目不断壮大,OOM(Out Of Memory)成为奔溃统计平台上的疑难杂症之一。大部分业务开发人员对于线上 OOM 问题一般都是暂不处理:一方面是因为 OOM 问题没有足够的 log,无法在短期内分析解决。另一方面可能是忙于业务迭代、身心疲惫,没有精力去研究 OOM 的解决方案。这
JVM 的栈上分配、TLAB、PLAB 有啥区别?
大家好,我是树哥。我们在学习 G1 回收器的时候,一般我们都会接触到 TLAB 和 PLAB 这两个术语。它们都是为了提高内存分配效率而存在的,但它们和栈上分配有什么区别呢?今天,就让树哥带着大家盘一盘。栈上分配稍微了解过 Java 虚拟机内存结构的同学都知道,在 Java 虚拟机中有两个关
OOM案例分析之 gc overhead limit exceeded问题
一个生产环境里,oom的gc overhead limit exceeded典型案例分析
jstat显示的full GC次数与CMS周期的关系
使用Oracle/Sun JDK来运行Java程序的时候,大家或许有用过jstat工具来观察GC的统计数据,例如上一篇日志里的Command prompt代码```$ jstat -gcutil `p
死磕synchronized二:系统剖析延迟偏向篇一
近期准备写一个专栏:从Hotspot源码角度剖析synchronized。前前后后大概有10篇,本篇文章聚焦分析偏向锁延迟策略:什么是延迟偏向、为什么需要延迟偏向、延迟偏向机制是怎样的、延迟偏向对锁膨胀的影响及证明、从Hotspot源码角度证明
JVM coredump分析系列(1):OOM导致的crash分析
笔者近期遇到多个内存 OOM 导致的crash,因为内存问题发生的原因不仅牵涉 JVM 还涉及到操作系统底层,在此整理一下相关的原理和分析思路,以便今后发生类似的问题可以有一个参考
垃圾回收全集之七:GC 算法实现篇(四)垃圾优先算法
G1最主要的设计目标是: 将STW停顿的时间和分布变成可预期以及可配置的
垃圾回收全集之六:GC 算法实现篇(三)并发标记-清除
CMS的官方名称为 “Mostly Concurrent Mark and Sweep Garbage Collector”(主要并发-标记-清除-垃圾收集器). 其对年轻代采用并行 STW方式的 mark-copy (标记-复制)算法, 对老年代主要使用并发 mark-sweep (标记-清除)算
JVM调优1个月,性能提升400倍!怎样做到的?
通过这一个多月的努力,将FullGC从40次/天优化到近10天才触发一次,而且YoungGC的时间也减少了一半以上,这么大的优化,有必要记录一下中间的调优过程。对于JVM垃圾回收,之前一直都是处于理论阶段,就知道新生代,老年代的晋升关系,这些知识仅够应付面试使用的。前一段时间,线上服务器的Ful
从源码出发看ZGC黑科技——栈水位(Stack Watermark)技术内幕
        jdk17已经出来半年了,作为一个长期支持的版本,笔者还是挺期待它的表现的。但是奈何最近比较忙,还有其他博客系列要收尾,就没有过多关注。最近看了下openjdk的官方wiki,惊奇的发现zgc的最大停顿时间从10ms降低到了1ms(实际上是jd
G1垃圾回收器在并发场景调优
一、序言目前企业级主流使用的Java版本是8,垃圾回收器支持手动修改为G1,G1垃圾回收器是Java 11的默认设置,因此G1垃圾回收器可以用很长时间,现阶段垃圾回收器优化意味着针对G1垃圾回收器优化。为了简化讨论,下面假设针对4C/16G物理机器进行优化。二、G1概览(一)了解G11、
【全网首发】从源码角度分析一次诡异的类被加载问题
最近有同学在做 APM 链路监控发现了一个诡异的类被加载的问题,没有被调用到的函数里面用到的类,居然触发了类加载,于是结合 JVM 的源码做了一下分析
揭开内存屏障的神秘面纱
很多人知道内存屏障这个东西应该是在学习volatile时看到的,但是对内存屏障依然存在很多疑惑:为什么要加内存屏障?内存屏障能解决什么问题?为什么能解决这些问题?
JVM故障分析及性能优化系列之五:常见的Thread Dump日志案例分析
我们在上篇文章中详细描述了[Thread Dump中Native Thread和JVM Thread线程的各种状态及描述](https://heapdump.cn/article/2780900),今
Native Memory Tracking 详解(4):使用 NMT 协助排查内存问题案例
从前面几篇文章,我们了解了 NMT 的基础知识以及 NMT 追踪区域分析的相关内容,本篇文章将为大家介绍一下使用 NMT 协助排查内存问题的案例。
如果线上遇到了OOM,该如何解决?
OOM 意味着程序存在着漏洞,可能是代码或者 JVM 参数配置引起的。这篇文章和读者聊聊,Java 进程触发了 OOM 后如何排查常说对生产环境保持敬畏之心,快速解决问题也是一种敬畏的表现1、为什么会 OOMOOM 全称 “Out Of Memory”,表示内存耗尽。
JVM经典面试20问
今天给大家分享20道JVM常考的面试题,答案也整理好了,不会的快快查漏补缺~以下是本期JVM面试题的目录:讲一下JVM的内存结构?说一下堆栈的区别?什么情况下会发生栈溢出?类文件结构什么是类加载?类加载的过程?什么是双亲委派模型?为什么需要双亲委派模型?
通过12 张图带你彻底理解 ZGC及调优
导语大家好,我是君哥。今天来聊一聊 ZGC。ZGC(Z Garbage Collector) 是一款性能比 G1 更加优秀的垃圾收集器。ZGC 第一次出现是在  JDK 11 中以实验性的特性引入,这也是 JDK 11 中最大的亮点。在 JDK 15 中 ZGC 不再是实验功能,可以正
【译】JVM c1、c2编译线程CPU消耗高怎么办?
c1、c2 编译器线程由 Java 虚拟机创建,以优化您的应用程序的性能。有时这些线程会倾向于消耗高 CPU。在这篇文章中,让我们更多地了解 c1、c2 编译器线程以及如何解决它们的高 CPU 消耗问题。读完这篇文章后,诸如 Hotspot JIT、c1 编译器线程、c2 编译器线程、代码缓存之类
将Xms设置为Xmx的好处,竟然还可以减少GC
当我们启动应用程序时,会指定初始内存大小和最大内存大小。对于在JVM上运行的应用程序,通过“-Xms”和“-Xmx”参数指定初始和最大内存大小。如果Java应用程序在容器上运行,则通过“-XX:InitialRAMPercentage”和“-XX:MaxRAMPercentage”参数指定。大多数公
线上一次简单的 JVM 调优,性能提升了15%
大家好,我是不才陈某~最近对负责的项目进行了一次性能优化,其中包括对 JVM 参数的调整,算是进行了一次简单的 JVM 调优,JVM 参数调整之后,服务的整体性能有 15% 左右的提升,还算不错。先介绍一下项目的基本情况:项目是一个高 QPS 压力的 web 服务,单机 QPS 一直维持在
Java中synchronized的优化
为了实现高效并发,虚拟机对 synchronized 做的一系列的锁优化措施。包括:适应性自旋、锁消除、锁粗化、轻量级锁、偏向锁。
记一次接口耗时异常排查过程
1现象某后端系统,处于整个调用链路偏后的位置,对接口性能有着比较严格的要求。因此对外承诺的三个9响应时间为200多毫秒。然而,从某天开始,一到上午流量高峰,服务耗时就报警,随机的从集群内的某些机器上报了出来,过了流量高峰就好很多。。。2问题排查一般的,排查接口耗时,基本都习惯从外部流量,
第1篇-关于Java虚拟机HotSpot,开篇说的简单点
开讲Java运行时,这一篇讲一些简单的内容。我们写的主类中的main()方法是如何被Java虚拟机调用到的?在Java类中的一些方法会被由C/C++编写的HotSpot虚拟机的C/C++函数调用,不过
贡献一道自创的超高套路面试题
最近在手撸JVM实现OOP的封装机制的时候,有个问题引起了我的眉头紧锁,这段创建对象的代码,在JVM内部创建了几个对象?为什么会创建Object对象呢?因为Java中所有的类都继承自Object类,所有对象的创建都会调用类的构造方法,而这些构造方法中都会调用Object的构造方法。
内存管理:判断对象是否存活
在堆里面存放着 Java 世界中几乎所有的对象实例,垃圾收集器在对 Java 堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对象)。 有两种判断对象是否存活的算法:引用计数算法、可达性分析算法。
SpringCloud Gateway堆外内存溢出排查
生产环境网关模块偶发的 OutOfDirectMemoryError 错误排查起来困难且曲折,2021-02-05号也出现过此问题,起初以为是 JVM 堆内存过小 (当时是 2g) 导致,后调整到8g(2月5号调整)。但是经过上次调整后5月7号又出现此问题,于是猜测可能是由于
如果面试官让你分析类初始化阶段的死锁现象
哈喽,大家好,我是江湖人送外号[道格牙]的子牙老师。准备写两篇文章透彻剖析下类的初始化阶段及初始化阶段的死锁问题:类的初始化做什么JVM底层是如何实现类的初始化的为什么会出现死锁问题怎么解释死锁问题如果证明你对死锁的判断是正确的我是如何论证的会由浅入深,循
一篇说明白什么是oom,为什么会oom,oom的类型和常见解决方法
oom说简单也简单,说复杂也复杂,不管简单和复杂,搞明白底层的逻辑肯定不会错,这一篇老文章帮助大家从0开始理解oom!
暴力破解美团最新JVM面试题:无限执行
昨天Java圈,美团曝出了一道**级面试题:为什么栈溢出后线程没有崩溃?为什么这段代码会永远执行下去?我的几个交流群、VIP群,争论不休,看大家都在Java层找答案。很明显,这个问题的答案不在Java层,接下来咱们分析下这个问题,然后一起去找答案,争取下次被问到,一举击溃面试官的心理防线
译 | The JVM Tool Interface (JVM TI): How VM Agents Work
原文出处:https://www.oracle.com/technical-resources/articles/javase/jvm-tool-interface.html翻译内容来自有道翻译。The JVM tool interface (JVM TI) is a standard nati
我就奇了怪了,STW到底是怎么做到的
今天想跟大家聊聊STW,它是怎么给程序世界按下暂停键的。STW,即Stop The World。为什么需要STW呢?JVM中要做到STW是很难的。为什么这么说呢?因为需要考虑很多很多因素。
使用perf解决JDK8U小版本升级后性能下降的问题
编者按:在升级JDK8U的小版本后(从8u74升级到8u202),遇到性能剧烈下降的问题(性能下降13倍)。该应用是一个非常简单的Web应用,且应用在JDK升级前后并无任何发布修改。通常来说JDK小版
字节对齐与Java的指针压缩(上)-字节对齐的渊源
声明:全是个人愚见,如果嗦滴不对请大佬们猛喷。在上篇文章[《从new Class()入手浅看JVM的oop-klass模型》][1]中,我们创建了一个ClassX:```javapublic clas
垃圾回收全集之五:GC 算法实现篇(二)并行GC
并行垃圾收集器这一类组合, 在年轻代使用 标记-复制(mark-copy)算法, 在老年代使用 标记-清除-整理(mark-sweep-compact)算法。
虚拟机中GUEST OS时钟(TIMEKEEP)问题的探讨
操作系统的时钟处理按理来说应该是个早已成熟的技术,不必再费口舌讨论什么。事实也的确如此。然而在虚拟环境下(不仅仅是xen,vmware这些虚拟机),对时钟的处理可绝非轻而易举,如果你耐心看看你虚拟环境
美团海量连接服务端jvm参数调优分享
应用:shark-新美大移动端网络优化(每日接受移动端请求约150亿) 应用特点: qps比较高,新生代增长飞快 用户的连接需要维持一段时间 单机需要维持海量连接,几十万的级别 以上三个特点导致有大量小对象聚集在old区,高峰期old区域增长非常快,对象在一段时间内肯定会消亡
优化统计代码执行耗时这样做才足够优雅!
导语代码耗时统计在日常开发中算是一个十分常见的需求,特别是在需要找出代码性能瓶颈时。可能也是受限于 Java 的语言特性,总觉得代码写起来不够优雅,大量的耗时统计代码,干扰了业务逻辑。特别是开发功能的时候,有个感受就是刚刚开发完代码很清爽优雅,结果加了一大堆辅助代码后,整个代码就变得臃肿了,自己
通过硬件计数器,将性能提升3倍之旅
本文通过对CPU层面的代码挖掘,发现JVM存在的问题,并通过对JVM打补丁的方式解决了大实例下性能不足的问题
第2篇-Java虚拟机这样来调用Java主类的main()方法
在前一篇 第1篇-关于Java虚拟机HotSpot,开篇说的简单些 中介绍了call_static()、call_virtual()等函数的作用,这些函数会调用JavaCalls::call()函数。
一次线上 FGC 问题排查,最后问题竟然是这个!
导语线上的虚拟机出现了回滚的问题,通过一步步排查发现竟然是Metaspace的问题,本篇详细解读了对FGC问题的排查过程。1.背景先介绍下背景。服务部署在弹性云上面。弹性云是一种动态可伸缩的服务器,底层是通过docker的方式创建的虚拟机而不是物理机。本次发布的应用 Maybach 共五台机器
一次由JVM参数、中间件配置引起的FGC性能调优
导语关于FGC的性能调优是大家非常喜欢的话题,本文通过三则前台应用FGC调优案例,分别介绍了由于JVM参数、中间件配置、业务代码层面引起的FGC的现象、分析过程及对应解法。希望能起到抛砖引玉的作用,以及给有同样疑惑的读者朋友们带来一些启发。前言闲鱼服务端应用广泛使用 Java 技术栈,基于JV
记一次内存溢出的分析经历
原文链接:https://www.cnblogs.com/superfj/p/8474288.html作者:Janti 说在前面的话朋友,你经历过部署好的服务突然内存溢出吗?你经历过没有看过Java虚
全网最硬核 JVM 内存详解(下)
本篇主要从 Hotspot 实现出发,以 Linux x86 环境为主,紧密贴合 JVM 源码并且辅以各种 JVM 工具验证帮助大家理解 JVM 内存的结构~
死磕synchronized三:系统剖析延迟偏向篇二
近期准备写一个专栏:从Hotspot源码角度剖析synchronized。前前后后大概有10篇,本篇文章是从Hotspot源码角度分析延迟偏向机制:新创建的对象的锁是是如何被延迟偏向影响的、延迟偏向之前加载的类的初始锁是什么锁、延迟偏向之后加载的类是无锁还是偏向锁
死磕synchronized一:JVM如何执行synchronized修饰的方法
近期准备写一个专栏:从Hotspot源码角度剖析synchronized。本篇文章聚焦分析JVM是如何执行synchronized修饰的方法的:编译系统是如何处理synchronized关键字的、JVM是如何选出锁定的对象的、模板解释器为了提升效率做了什么、什么情况会由执行例程切入C++代码、如何单
从hotspot源码层面剖析Java的多态实现原理
由于多态需要通过动态绑定才能得以实现,而绑定通俗一点讲就是让不同的对象对同一个函数进行调用,或者反过来讲,就是让同一个函数与不同的对象绑定起来,所以多态得以实现的一个大前提就是,编程语言必须是面向对象的。
带你用Java实现JVM篇一:实现字节码文件解析器
今天开始更新正式内容的第一篇:带你用Java实现字节码文件解析器。什么是解析器?解析器干些什么?要怎么实现?有哪些需要注意的地方?Hotspot源码中有解析器吗?
死磕synchronized五:系统剖析偏向锁篇二
近期准备写一个专栏:从Hotspot源码角度剖析synchronized。前前后后大概有10篇,本篇文章是针对synchronized修饰方法这种情况写的。关于synchronized代码段,其实除了lock record外,差别不大。
秒懂JVM的三大参数类型,就靠这十个小实验了
本实验的目的是讲解 JVM 的三大参数类型。在JVM调优中用到的最多的 XX 参数,而如何去查看和设置 JVM 的 XX 参数也是调优的基本功,本节以实验的方式讲解 JVM 参数的查看和设置。希望大家能有所启发。标配参数常见标配参数-version,获取JDK版本-help,获取帮助-s
JVM系列第14讲:JVM参数之GC日志配置
说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志。而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数。今天就让我们来学习一下 Java 虚拟机中所有与 GC 日志有关的参数。相信掌握了这些参数之后,对于大家线上
看看毕昇JDK团队是如何解决JVM中CMS的Crash
编者按:笔者遇到一个非常典型 JVM 架构相关问题,在 x86 正常运行的应用,在 aarch64 环境上低概率偶现 JVM 崩溃。这是一个典型的 JVM 内部 bug 引发的问题。通过分析最终定位到
浅谈Java内存上分配空间和内存分配策略
Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点,所以,即使是一个Java的初学者,也一定或多或少的对JVM有一些了解。可以说,关于JVM的相关知识,基本是每个Java开发者必学的知识点,也是面试的时候必考的知识点。在JVM的内存结构中,比较常见的两个区域就是堆内存和栈内
GC时对象地址变了,hashCode如何保持不变?
前言前几天跟朋友交流,引出了一篇文章《GC复制存活对象,它内存地址变了么?》,我们得知在Hotspot虚拟机下,当GC发生时,对象的地址是会发生变化的。同时我们也知道,无论何时调用同一对象的hashC
记一次cpu飙升问题排查
我先给大家看一下一副正常的gc曲线监控(为保密性,我自己按照平台监控画了出来)
虚拟机内存管理之内存分配器
本文意在通过深入剖析常用的内存分配器的关键实现,以理解虚拟机动态内存管理的设计哲学,并为实现虚拟机高效的内存管理提供指引。
JVM专家聊字符串常量池(一)
本文主要跟大家聊聊字符串常量池,即Java代码中的字符串在JVM中到底是如何存储的。如果我们来写一个JVM,我们如何处理字符串。这个问题很简单了,使用散列表,即hashtable。Java世界存在两个hashtable类型结构:Java的HashTable及HashMap,纯Java实现的
深度长文:一篇带你完整理解堆外内存 Metaspace
本文的内容主要是翻译 Thomas Stüfe 的 Metaspace 系列文章,他是 OpenJDK Committer/Reviewer. JVM developer at SAP,一看 Title 就很靠谱,因为他是 JVM 开发者,当然主要是内容也写得非常棒。
一次因多线程使用不当导致OOM的排查过程
导语多线程使用不当会导致OOM,如果没有及时发现更会导致GC,本篇是作者日常中遇到到因多线程使用不当导致的OOM排查过程,也是一篇比较经典的OOM排查实战,希望大家读后有所收获。正文事故描述老规矩,我们先看下事故过程:某日,从 6 点 32 分开始少量用户访问 app 时会出现首页访问异常,
死磕synchronized四:系统剖析偏向锁篇一
近期准备写一个专栏:从Hotspot源码角度剖析synchronized。前前后后大概有10篇,从本篇文章开始,给大家分享我对偏向锁的研究成果。synchronized刚开始引入偏向锁的时候我就觉得很奇怪:轻量级锁已经是应用态的锁了,为什么还要搞一个偏向锁,后面花了很长时间研究这个问题,并找到了答案
JVM自定义类加载器在代码扩展性的实践
作者:vivo互联网服务器团队-Wang Fei一、背景 名单管理系统是手机上各个模块将需要管控的应用配置到文件中,然后下发到手机上进行应用管控的系统,比如各个应用的耗电量管控;各个模块的管控应用文件考虑到安全问题,有自己的不同的加密方式,按照以往的经验
JVM系列第8讲:JVM 垃圾回收机制
在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由《Java 虚拟机规范》指定的,每个 Java 虚拟机可能都有不同的实现。其实涉及到 Java 虚拟机的内存,就不得不谈到 Java 虚拟机的垃圾回收机制。因为内存总是有限的,我们需要一个机制来不断地回收废弃的内存,从而实
JVM故障分析及性能优化系列之一:使用jstack定位线程堆栈信息
前一段时间上线的系统升级之后,出现了严重的高CPU的问题,于是开始了一系列的优化处理之中,现在将这个过程做成一个系列的文章。 基本概念在对Java内存泄漏进行分析的时候,需要对jvm运行期间的内存占用
全网最硬核 JVM 内存详解(上)
网上有很多关于 JVM 内存结构的分析以及图片,但是由于不是一手的资料亦或是人云亦云导致有很错误,造成了很多误解;
JVM系列第13讲:JVM参数之追踪类信息
我们都知道 JVM 在启动的时候会去加载类信息,那么我们怎么得知他加载了哪些类,又卸载了哪些类呢?我们这一节就来介绍四个 JVM 参数,使用它们我们就可以清晰地知道 JVM 的类加载信息。为了方便演示,我们使用下面的程序作为本次的演示程序。/** * @author chenshuyi *
一文带你弄懂 JVM 三色标记算法!
大家好,我是树哥。最近和一个朋友聊天,他问了我 JVM 的三色标记算法。我脑袋一愣发现竟然完全不知道!于是我带着疑问去网上看了几天的资料,终于搞清楚啥事三色标记算法,它是用来干嘛的,以及它和 CMS 回收器和 G1 回收器的关系了。今天,就让树哥带着大家一起盘一盘它!根可达算法我们要进行垃圾
JVM系列第1讲:Java 语言的前世今生
Java 语言是一门存在了 20 多年的语言,其年纪比我自己还大。虽然存在了这么长时间,但 Java 至今都是最大的工业级语言,许多大型互联网公司均采用 Java 来实现其业务系统。大到国际电商巨头阿里巴巴,小到无名小公司,我们均可看到 Java 的身影。我是 2010 年开始接触 Java 语言
JVM系列第5讲:字节码文件结构
前面我们说到 Java 虚拟机使用字节码实现了跨平台的愿景,无论什么系统,我们都可以使用 Java 虚拟机解释执行字节码文件。但其实字节码是有一套规范的,而规定字节码格式的就是《Java 虚拟机规范》。《Java 虚拟机规范》规定了 Java 虚拟机结构、Class 类文件结构、字节码指令等内容。其
JVM故障分析及性能优化系列之三:jstat命令的使用及VM Thread分析
前面提到了一个[使用jstack的shell脚本](https://heapdump.cn/article/2711530),通过命令可以很快地定位到指定线程对应的堆栈信息。 使用jstat命令当服务
JVM:并发的可达性分析
当前主流编程语言的垃圾收集器基本上都是依靠可达性分析算法来判定对象是否存活的
JVM性能调优--YGC
YGC耗时问题可以说千奇百怪,但是万变不离其中,我们只要能够掌握YGC的几个关键节点涉及的影响,从原理着手分析,应该是没有什么大问题的~
Java的运行时数据区域
本文从概念上介绍 Java 虚拟机内存的各个区域,讲解这些区域的作用、服务对象以及其中可能产生的问题。
JVM coredump分析系列(4):常见的SIGBUS案例分析
笔者先前遇到多个SIGBUS crash问题,在此处归纳整理下问题定位思路并且给出复现的用例,以便提升定位同类问题的效率
JVM故障分析及性能优化系列之四:jstack生成的Thread Dump日志线程状态
前面文章中只分析了Thread Dump日志文件的结构,今天针对日志文件中 Java EE middleware, third party & custom application Threads 部分线程的状态进行详细的分析。
【译】关于JVM — JAVA虚拟机的一篇简单科普
JAVA的美丽是JVM。当您使用java时,您可能在某个时候听说过Java虚拟机(JVM)。 背景1995年,James Gosling为Sun Microsystems设计了JAVA,Java是一种多范式(即面向对象类、结构、命令式、泛型、反光、并发)编程语言
JVM的多态是如何实现的
哈喽,我是子牙。十余年技术生涯,一路披荆斩棘从技术小白到技术总监到JVM专家到创业。技术栈如汇编、C语言、C++、Windows内核、Linux内核。特别喜欢研究虚拟机底层实现,对JVM有深入研究。分享的文章偏硬核,很硬的那种。 手撸过JVM、内存池、垃圾回收算法、synchroni
JDK14-ZGC调研初探
我在性能调优路上的打怪日记 背景公司ElasticSearch准备进行升级,而ElasticSearch7以上则是已经在支持使用JDK11了,JDK11中最大的特点就是 ZGC,更快的垃圾回收,更爽
第3篇-CallStub新栈帧的创建
在前一篇文章 第2篇-JVM虚拟机这样来调用Java主类的main()方法  中我们介绍了在call_helper()函数中通过函数指针的方式调用了一个函数,如下:StubRoutines::call_stub()( (address)&link,
09 给对象添加偏向锁的调试
大家 平常使用到 synchronized 的时候一定是对它的使用有一定的了解了, 那么我们这里来调试一下
JVM故障分析及性能优化系列之二:jstack生成的Thread Dump日志结构解析
[上一篇文章讲述了如何使用jstack生成日志文件](https://heapdump.cn/article/2711530),这篇文章首先对Thread Dump日志文件的结构进行分析。一个典型的t
08 String.intern 同一个字符串返回不同的引用
突然有一个想法, 我们之前 不是一直经常会看到 这样的示例么, 然后一般情况下 都会有很多的剖析, 这四个等式是如何如何, 所以结果是怎样 
最新研发面试题,Java中的静态方法为什么不能调用非静态方法
昨晚京东大佬勇哥在群里分享了一道他新创的JVM面试题,Java中的静态方法为什么不能调用非静态方法?我听完后觉得还挺有意思的,分享给大家
JVM专家权威分析字符串常量池(二)
哈喽,我是子牙。十余年技术生涯,一路披荆斩棘从技术小白到技术总监到JVM专家到创业。技术栈如汇编、C语言、C++、Windows内核、Linux内核。特别喜欢研究虚拟机底层实现,对JVM有深入研究。分享的文章偏硬核,很硬的那种。 手撸过JVM、内存池、垃圾回收算法、synchroniz
你真的了解垃圾回收吗:引用计数法和可达性分析举例、垃圾收集算法介绍
 Java 虚拟机的自动内存管理,将原本需要由开发人员手动回收的内存,交给垃圾回收器来自动回收。因为是自动机制,我们平时不会直接接触,但还是有必要了解与垃圾回收实现相关的问题。下文先从基础开始学习垃圾回收。 垃圾回收的目的垃圾回收的目的是回收堆内存中不再使用的对象所
一次诡异的JVM堆外内存泄漏
导语堆外metaspace内存占用高达3GB多 ,机器内存耗尽后导致宕机,jmap查看JVM对象信息,发现大量和反射相关对象被生成,本篇介绍的是一次诡异的jvm对外内存泄漏排查及优化过程,希望对阅读的各位有所帮助。正文一、现象报警详情: MEM usage above 90% (curre
watchdog没有生效引发的bug?
事故现场业务同学反馈有数据是负的。这个数量就像库存一样,最小值只能是0 。看到这个情况,一下子有点不相信了。这个地方之前是有bug的:第一次是有线程安全问题第二次是事务与分布式锁重叠的问题会出现事务没提交,但分布式锁已经释放,前端连续发起多次取消时,会引发幂等问题。当@Transact
垃圾回收全集之八:GC 调优基础篇
GC调优(Tuning Garbage Collection)和其他性能调优是同样的原理。
不会JVM调优怎么进互联网大厂
如果说有什么在面试中经常被问到,但是在实际工作中又不经常用到的Java技术,那么JVM调优绝对可以排得上号。每当有同学被问到这个问题的时候,内心的OS大概是这样:我一个QPS几百的系统,有啥好调优的,默认配置用用得了,调JVM参数整不好系统还能干崩了,想想好像是这么个道理。但是对于一些高并发大流量业
MProfiler通过Hook进行性能诊断
本文含有大量代码,如果阅读不方便,可去MProfiler官网阅读。地址:http://mprofiler.com/pages/guide05/Hook翻译成中文就是勾取的意思,是一种截取信息,更改程序执行流向,添加新功能的技术。MProfiler也Hook了一些方法,这些方法包括:(1)Java
02 FinalReference.referent的回收时机
前言 在某本书上面曾经看到过, Hotspot VM 的 gc 是准确式GC, 我的理解就是 这一次 gc 之后 应该会把所有的 "垃圾对象" 清理掉 假设对应的 $FinalizedClazz 重写了 finalize 方法, 并且有一个 没有任何
JNI不正确的信号处理导致JVM崩溃问题分析
编者按:JNI 是 Java 和 C 语言交互的主要手段,要想做好 JNI 的编程并不容易,需要了解 JVM 内部机理才能避免一些错误。本文分析 Cassandra 使用 JNI 本地库导致 JVM
05 相互引用的类加载的调试
最近看到了这样的一篇文档,Java类初始化的相互引用和次序问题;, 也是一个很经常看到的基础问题但是 在以前的话, 我一定是思考那些理论来分析这个问题, 比如 main 中读取 Clazz1.x1 导致了 Clazz1 的初始化
垃圾回收全集之九:GC 调优的工具篇
进行GC性能调优时, 需要明确了解, 当前的GC行为对系统和用户有多大的影响。有多种监控GC的工具和方法, 本章将逐一介绍常用的6个工具。
06 “eden没有发生minor gc, 对象直接分配在了old gen“ 的调试
最近在看这样一篇文章的时候,eden区没有发生minor gc,对象直接分配在了old gen,看到了 R大 的叱咤风云, 讲解的非常细致, 十分令人佩服
找出栈上的指针/引用
问:请教下,识jvm堆栈中一个数据类型是否为为引用类型,目前虚拟机实现中是如何做的?调用栈里的引用类型数据是GC的根集合(root set)的重要组成部分;找出栈上的引用是GC的根枚举(root en
相同版本JVM和Java应用,在X86和AArch64平台性能相差30%,何故?
编者按:目前许多公司同时使用X86和Aarch642种主流的服务器。但是相同版本的JVM和Java应用,相同的参数JVM参数,但是应用性能在不同的平台中表现相差30%,X86远好于Aarch64平台。
看完intern源码,和面试官battle,巨自信
什么情况字符串会写入常量池;什么情况字符串不会写入常量池;intern底层是如何实现的;字符串过多导致OOM如何解决
入门篇一:写给小白的JVM学习指南
Java 虚拟机是学习 Java 的基础,也是迈入高级 Java 开发工程师的必备知识点。所以今天这篇文章我们来聊聊如何从零开始学习 Java 虚拟机。基础对于刚刚接触 JVM 的同学来说,JVM 就像一个黑盒一样,完全不知道这是一个什么东西。所以对于小白来说,最重要是搞清楚 JVM 到底是干嘛
为什么 JVM 叫做基于栈的 RISC 虚拟机
有了指令集架构这层抽象,我们就无需关心其背后的实现是虚拟机还是物理机,甚至假如实际的执行是基于寄存器实现的,但指令集架构里是基于栈的,我们也可以说这套指令集架构是基于栈的。
12 给对象添加轻量级锁的调试
接着前三篇,我们这里来调试一下轻量级锁;以下内容基于 jdk9 + lldb-1001.0.13.3
JVM系列开篇:为什么要学虚拟机?
跟许多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看。所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试。但我经过了几年的学习和实战,我发现其实学习虚拟机并不仅仅在于面试,而在于更深入地理解 Java 这门语言,以及为未来排查线上问题打下基础。先聊聊我的
04 对象的默认内存布局
最近看到了这样的一篇文章,一个对象的引用占多少个字节呢?4个?8个?算出来都不对,这是一个之前想要弄明白, 但是这块的代码似乎是看着有点复杂, 所以一直没有花时间来整理一下, 最近看到了一篇文章, 看了一下 R大的分析 
JVM系列第7讲:JVM 类加载机制
当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析、运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制。JVM 虚拟机执行 class 字节码的过程可以分为七个阶段:加载、验证、准备、解析、初始化、使用、卸载。在开始聊之前,先给大家看一道
JVM的垃圾收集算法
介绍分代收集理论和几种垃圾收集算法(标记-清除、标记-复制、标记-整理)的思想及其发展过程。
配置Redis LUA脚本
前言在工作中碰到统计相关的业务,原先是从DB里面读数据,还因为是几乎近乎实时统计,仔细思考发现公式还是有优化的空间,考虑放到内存里面来统计,之前的单体服务倒是很好解决,加锁就可以,但是碰到微服务就要考虑多端并发原子性问题,自然而然想到了Lua脚本。1.配置Lua脚本脚本文件local
10 偏向锁的退出的调试
以下内容基于 jdk9 + lldb-1001.0.13.3 ,另外以下运行时数据可能是来自于多次调试, 可能会存在运行时数据 对不上的情况, 但是的条理逻辑会在文字中描述清楚的 
JAVA系列之JVM内存调优
一、前提JVM性能调优牵扯到各方面的取舍与平衡,往往是牵一发而动全身,需要全盘考虑各方面的影响。在优化时候,切勿凭感觉或经验主义进行调整,而是需要通过系统运行的客观数据指标,不断找到最优解。同时,在进行性能调优前,您需要理解并掌握以下的相关基础理论知识:1、JVM垃圾收集器和垃圾回收算法2、
难怪我看不懂!call_stub竟然这么玄乎!
这篇文章想跟大家聊聊Hotspot源码的call_stub,这个问题是卷Hotspot的小伙伴问得比较多的,坦白讲,就这么一段代码,涉及到的知识点还真不少:函数指针、宏、变量定义花招
携程一面:什么是双亲委派模型?
这是携程一面的一个 JVM 面试真题。参加过校招面试的同学,应该对这个问题不陌生。一般提问 JVM 知识点的时候,就会顺带问你双亲委派模型
JVM系列第12讲:JVM参数之查看JVM参数
今天要说的是如何查看 JVM 中已经设置的参数,包括显示参数和隐式参数。打印显式参数 -XX:+PrintVMOptions该参数表示程序运行时,打印虚拟机接受到的命令行显式参数。我们用下面的命令运行程序:java -XX:+UseSerialGC -XX:+PrintVMOptions c
记一次线上RPC超时故障排查及后续GC调优思路
本文记录了一次线上RPC服务调用超时问题的排查流程,排查过程中涉及到 JVM 优化的过程与思路,包括 JVM GC 原理以及问题排查思路,分享出来希望对大家有所帮助。本文概要RPC服务异常和排查过程排查方向问题根因和解决方案JVM GC 原理与优化方案基础排查工具
垃圾回收全集之十:GC 调优的实战篇—高分配速率(High Allocation Rate)
本章介绍导致GC性能问题的典型情况。相关示例都来源于生产环境, 为演示需要做了一定长度的精简。
关于 Java GC 算法背景原理与内存池划分
导语GC 是英文词汇 Garbage Collection 的缩写,中文一般直译为“垃圾收集”。当然有时候为了让文字更流畅,也会说“垃圾回收”。一般认为“垃圾回收”和“垃圾收集”是同样的意思。此外,GC
Java虚拟机
true or false?
有同学在星球问了这样一个问题~
译 | JEP 331: Low-Overhead Heap Profiling
Summary(概要)Provide a low-overhead way of sampling Java heap allocations, accessible via JVMTI.提供一种低开销的Java堆分配采样方式,可通过JVMTI访问。Goals(目标)Provide a wa
深入思考:JVM是如何进行方法调用的
我们知道方法调用会产生栈帧,存在虚拟机栈中,那么究竟JVM是如何进行方法调用的呢?
垃圾回收全集之十一:GC 调优的实战篇—过早提升(Premature Promotion)
本章介绍导致GC性能问题的典型情况。相关示例都来源于生产环境, 为演示需要做了一定长度的精简。
01 PhantomReference没有进入ReferenceQueue
最近看到一篇文章, 然后 基于改文章的代码, 做了一些 调整, 然后 发现了一些 奇怪的事情, 并稍微整理了一下
03 回顾反射参数问题
在上周的时候, 看了一下我的 "05 问题" 这一系列博客, 看了一下第一篇文章, "01 反射参数问题", 发现了一些当时遗留的一些问题, 当时可能由于 水平啊, 理解啊等各方面原因, 这个就当做了一个问题 记录在了这里~
JVM高阶面试:Java8为什么使用元空间替换永久代?
Java8 选择使用元空间(Metaspace)替代永久代(PermGen)是 JVM 内存模型的一次重大改进
JVM调优工具锦囊
Arthas线上分析诊断调优工具以前我们要排查线上问题,通常使用的是jdk自带的调优工具和命令。最常见的就是dump线上日志,然后下载到本地,导入到jvisualvm工具中。这样操作有诸多不变,现在阿里团队开发的Arhtas工具,拥有非常强大的功能,并且都是线上的刚需,尤其是情况紧急,不方便立刻
Java虚拟机
Java内存模型
《Java虚拟机规范》中曾试图定义一种“Java内存模型”(Java Memory Model,JMM)来屏蔽各种硬件和操作系统的内存访问差异, 以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。 Java内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储

有开始,就会有进​步!

在追求性能的道路上,记录每一刻的成长!源码解读,编程技巧,外文翻译,技术实践,线上案例等等,记录自己,启发他人!

专家作者推荐

巡山小汪

关注微信公众号《解Bug之路》,有问题请在公众号中咨询:) 无论多么艰苦的时刻,都不要忘记,辉煌的未来,在你的眼中闪耀!

飞哥开发内功

《深入理解Linux网络》作者,腾讯搜狗十年工程师,公众号「开发内功修炼」作者!

踩刀诗人

聊聊技术,唠唠段子,偶尔做菜写诗,欢迎关注我的公众号 踩刀诗人

Brand

搜索关注微信公众号【架构与思维】:撰稿者为bat、字节的几位高阶研发/架构,专注技术分享。

专题推荐

Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例的 OPS 能够达到 10W 左右。但也正因此如此,当我们在使用 Redis 时,如果发现操作延迟变大的情况,就会与我们的预期不符。

Redis作为高性能的内存数据库,在大数据量的情况下也会遇到性能瓶颈,日常开发中只有时刻谨记优化铁则,才能使得Redis性能发挥到极致。
7篇文章10592阅读量
JDK1.5中引入了线程池,合理地利用线程池能有效的提高程序的运行效率,但不当的使用线程池也会带来致命的危害。作为使用最多的ThreadPoolExecutor,很有必要深入理解的其源码与实现原理。
11篇文章33045阅读量