JMAP

一次频繁Full GC的排查过程

假如想象 提交于 2020-04-17 03:26:10
【推荐阅读】微服务还能火多久?>>> 问题描述 最近公司的线上监控系统给我推送了一些kafka lag持续增长的消息,我上生产环境去看了相应的consumer的情况,发现几台机器虽然还在处理消息,但是速度明显慢了很多。 问题猜测与验证 我猜测是JVM频繁做Full GC,导致进程也跟着频繁卡顿,处理消息的速度自然就慢了。为了验证这个想法,先用jstat看看内存使用情况: jstat -gcutil 1 1000 #1是进程号 结果如我所料,几乎1秒钟就要做一次FGC,能安安静静的做个正常的consumer才有鬼了。 赶紧留了一台consumer拿来做分析,把别的几台consumer都重启。不管怎样,先恢复消费能力再说! 内存泄露root cause排查 1秒一次FGC,那肯定是发生内存泄露了。 二话不说,把堆dump下来先! jmap -F -dump:format=b,file=heapDump 1 #1是进程号 生成的heapDump文件有将近2个G的大小,这么大个文件,为了不影响生产环境的机器,还是scp到本地进行分析吧! jhat了一下,直接卡在那里不动了。没办法,祭出VisualVM来帮忙。导入文件之后,发现有一大堆HashMap的Node在那占着: 然而并不知道这是个啥,点进去看看内容,发现有一大堆node的key类型是X509CertImpl: 这时候我意识到

面试之Java虚拟机专题

若如初见. 提交于 2020-04-10 10:00:07
说下对象的创建方法?对象的内存布局?对象的访问定位? 四种不同的方法创建对象 1、用new语句创建对象,这是最常用的创建对象的方式; 2、调用对象的clone方法。   MyObject obj =new MyObject();   MyObject objs= obj.clone(); 使用clone方法克隆一个对象的步骤:   1)被克隆的类要实现Cloneable接口;   2)被克隆的类要重写clone方法; 1 class Obj implements Cloneable{ 2 private Date birth = new Date(); 3 public Date getBirth(){ 4 return birth; 5 } 6 public void setBirth(){ 7 this .birth= birth; 8 } 9 public void changeDate(){ 10 this .birth.setMonth(4 ); 11 } 12 public Object clone(){ 13 Obj o = null ; // o指向了复制后的新对象 14 try { 15 o=(Obj) super .clone(); // 实现浅复制 16 } catch (CloneNotSupportedException e){ 17 e

面试之Java虚拟机专题

我们两清 提交于 2020-04-10 07:52:23
说下对象的创建方法?对象的内存布局?对象的访问定位? 四种不同的方法创建对象 1、用new语句创建对象,这是最常用的创建对象的方式; 2、调用对象的clone方法。   MyObject obj =new MyObject();   MyObject objs= obj.clone(); 使用clone方法克隆一个对象的步骤:   1)被克隆的类要实现Cloneable接口;   2)被克隆的类要重写clone方法; 1 class Obj implements Cloneable{ 2 private Date birth = new Date(); 3 public Date getBirth(){ 4 return birth; 5 } 6 public void setBirth(){ 7 this .birth= birth; 8 } 9 public void changeDate(){ 10 this .birth.setMonth(4 ); 11 } 12 public Object clone(){ 13 Obj o = null ; // o指向了复制后的新对象 14 try { 15 o=(Obj) super .clone(); // 实现浅复制 16 } catch (CloneNotSupportedException e){ 17 e

JVM调优实战分析

|▌冷眼眸甩不掉的悲伤 提交于 2020-04-06 18:14:42
一、查看服务器项目JVM参数以及参数分析 1、jps 命令 : 列出系统中所有的 Java 应用程序以及PID 如下图所示,26647就是我部署在服务器的一个小项目的 PID 2、jmap命令:查看堆的使用情况 如下所示,数据为未调整的默认值 [root@VM_49_159_centos ~]# jmap -heap 26647 Attaching to process ID 26647, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.162-b12 using thread-local object allocation. Mark Sweep Compact GC Heap Configuration: (堆的结构配置) MinHeapFreeRatio = 40 ( 空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制. ) MaxHeapFreeRatio = 70 ( 空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制. ) MaxHeapSize = 482344960 (460.0MB) (堆的最大值) NewSize = 10485760 (10.0MB) (初始年轻代大小) MaxNewSize =

JVM性能调优监控工具jps、jstack、jstat、jmap、jinfo使用详解

☆樱花仙子☆ 提交于 2020-03-26 06:43:02
JVM性能调优监控工具jps、jstack、jstat、jmap、jinfo使用详解 https://www.cnblogs.com/baihuitestsoftware/articles/6382733.html jps 查看所有的jvm进程,包括进程ID,进程启动的路径等等。 我自己也用PS,即:ps -ef | grep java jstack 观察jvm中当前所有线程的运行情况和线程当前状态。 系统崩溃了?如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。 系统hung住了?jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。 jstat jstat利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloader,compiler,gc情况; 特别的,一个极强的监视内存的工具,可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量,以及加载类的数量。 jmap 监视进程运行中的jvm物理内存的占用情况,该进程内存内

面试刷题1: 简要介绍java平台?java是解释执行的吗?

天涯浪子 提交于 2020-03-24 11:38:45
3 月,跳不动了?>>> 我是李福春,我为面试做准备。今天回答第一个问题。 java平台简要介绍?java是解释执行的吗? java平台 java平台基于jvm具备write once,run everywhere的跨平台能力;<br />具备自动垃圾回收;<br />具有无所不能的生态圈,比如spring,大数据,搜索,maven等; java语言是面向对象的,常见的特性有泛型,反射,lambda; jdk jre包括jvm,java类库,模块; jdk包含jre,还提供了一些工具,比如编译工具,诊断工具,辅助工具; jvm赋能java,使得java具备跨平台的能力,jvm还支持其他的语言,比如常见的groovy,scala等; jvm常见的垃圾收集器有serialGC,parallelGC,CMS,G1<br />常见垃圾回收算法:标记,复制,整理 java核心类库包括 集合,io, 网络,并发,util ;<br />此外还有海量的第三方库。 java的诊断工具有 jmap,jstack,jconsole等; java是解释执行吗? java是综合性的执行,即部分解释执行,部分编译执行;<br /> <br />java的生命周期分为编译期,运行期;<br />编译期是基于类加载器:<br />Bootstrap,Application,Extended,自定义类加载器<br

求你了,别再说Java对象都是在堆内存上分配空间的了!

蹲街弑〆低调 提交于 2020-03-23 18:37:54
3 月,跳不动了?>>> Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点,所以,即使是一个Java的初学者,也一定或多或少的对JVM有一些了解。可以说,关于JVM的相关知识,基本是每个Java开发者必学的知识点,也是面试的时候必考的知识点。 在JVM的内存结构中,比较常见的两个区域就是堆内存和栈内存(如无特指,本文提到的栈均指的是虚拟机栈),关于堆和栈的区别,很多开发者也是如数家珍,有很多书籍,或者网上的文章大概都是这样介绍的: 1、堆是线程共享的内存区域,栈是线程独享的内存区域。 2、堆中主要存放对象实例,栈中主要存放各种基本数据类型、对象的引用。 但是,作者可以很负责任的告诉大家,以上两个结论均不是完全正确的。 在我之前的文章《Java堆内存是线程共享的!面试官:你确定吗?》中,介绍过了关于堆内存并不是完完全全的线程共享有关的知识点,本文就第二个话题来探讨一下。 对象内存分配 在《Java虚拟机规范》中,关于堆有这样的描述: 在Java虚拟机中,堆是可供各个线程共享的运行时内存区域,也是供所有类实例和数组对象分配内存的区域。 在《Java堆内存是线程共享的!面试官:你确定吗?》文章中,我们也介绍过,一个Java对象在堆上分配的时候,主要是在Eden区上,如果启动了TLAB的话会优先在TLAB上分配,少数情况下也可能会直接分配在老年代中

进程无故消失的破案历程

耗尽温柔 提交于 2020-03-12 11:10:35
概述 前段时间公司有个系统的进程老是无故退出,在客户那边好好的,在家里服务器上老是出现,而且出现的时间也没啥规律,当然最终查出来还是有规律的,不过这个规律比较特别。大家看了后面的内容之后就明白了,真的很特殊! 初步分析 进程Crash? 当同事找到我的时候,我第一反应是是不是进程Crash了,如果是crash,那通常情况下会有crash的日志,检查了一遍,什么日志都没有留下,当然有时候Crash了,JVM也确实也不会留下Crash日志,不过这个特别罕见了,绝大部分是人为操作了。 被OS Kill? 既然不是Crash,那是不是系统存在内存泄露,被OS Kill了,不过很快通过dmesg也排除了,因为没有看到任何kill的迹象。 System.exit? 排除掉以上两个因素之后,接着马上就怀疑是否有什么代码执行过System.exit,于是重新编译了一把JDK,在System的exit方法处打印了些日志,于是坐等奇迹的发生。 令人兴奋的是,进程真的消失了,可是令人遗憾的是,我们埋点的日志并没有出现。这让我再次陷入沉思。 回归源码 从日志看确实是调用了ShutdownHook 于是找到addShutdownHook源码的位置 再次翻了一下JDK的源码,除了正常退出,System.exit等之外还有哪些情况会调用这个Shutdown的Hook,于是将埋点埋到了Shutdown

jvm笔记

坚强是说给别人听的谎言 提交于 2020-03-10 22:13:34
jhat jmap jstat jstack 来源: oschina 链接: https://my.oschina.net/u/3730149/blog/3191260

Java命令学习系列(三)——Jmap

点点圈 提交于 2020-03-07 20:10:45
jmap是JDK自带的工具软件,主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。可以使用jmap生成Heap Dump。在 Java命令学习系列(零)——常见命令及Java Dump介绍 和 Java命令学习系列(二)——Jstack 中分别有关于Java Dump以及线程 Dump的介绍。 这篇文章主要介绍Java的堆Dump以及jamp命令 什么是堆Dump 堆Dump是反应Java堆使用情况的内存镜像,其中主要包括 系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态 等。 一般,在内存不足、GC异常等情况下,我们就会怀疑有 内存泄露 。这个时候我们就可以制作堆Dump来查看具体情况。分析原因。 基础知识 Java虚拟机的内存组成以及堆内存介绍 Java GC工作原理 常见内存错误: outOfMemoryError 年老代内存不足。 outOfMemoryError:PermGen Space 永久代内存不足。 outOfMemoryError:GC overhead limit exceed 垃圾回收时间占用系统运行时间的98%或以上。 jmap 用法摘要 Usage: jmap [option] <pid> (to connect to running process) jmap [option] <executable