HeapAnalyzer

JVM dump和分析

和自甴很熟 提交于 2020-10-28 13:21:56
原文链接:https://www.dubby.cn/detail.html?id=9098 1、dump jmap -dump:live,format=b,file=~/Desktop/dump.hprof 1110 其他参数意义: Usage: jmap [option] <pid> (to connect to running process) jmap [option] <executable <core> (to connect to a core file) jmap [option] [server_id@]<remote server IP or hostname> (to connect to remote debug server) where <option> is one of: <none> to print same info as Solaris pmap -heap to print java heap summary -histo[:live] to print histogram of java object heap; if the "live" suboption is specified, only count live objects -clstats to print class loader statistics

面试官:我就问了一个JVM性能调优,没想到他能吹半个小时

僤鯓⒐⒋嵵緔 提交于 2020-10-24 00:40:02
一、JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配,Perm不属于堆内存,由虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。 年轻代(New):年轻代用来存放JVM刚分配的Java对象 年老代(Tenured):年轻代中经过垃圾回收没有回收掉的对象将被Copy到年老代 永久代(Perm):永久代存放Class、Method元信息,其大小跟项目的规模、类、方法的量有关,一般设置为128M就足够,设置原则是预留30%的空间。 New又分为几个部分: Eden:Eden用来存放JVM刚分配的对象 Survivor1 Survivro2:两个Survivor空间一样大,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间来回Copy,当满足某个条件,比如Copy次数,就会被Copy到Tenured。显然,Survivor只是增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。 2.垃圾回收算法 垃圾回收算法可以分为三类,都基于标记-清除(复制)算法: Serial算法(单线程) 并行算法 并发算法

out of memory

我与影子孤独终老i 提交于 2020-08-18 14:24:17
想要成为架构师, 要是连内存泄露都解决不了, 那你还不够格, 回家再练练吧. java的内存泄露, 基本大家在工作中基本都会用到, 作为一个运维开发出生的人, 还记得以前总是给我们的架构师抓取内存文件heap.bin, 而自己其实是真的没有好好研究过怎么查看或者分析这个文件的, 我觉得有些人也是懵逼的, 并不知道具体如何来查看具体哪里内存泄漏了, 今天正好也是解决了一个线上的问题, 所以总结出来, 希望和大家一起进步. 1. Jvm heap dump(堆转储文件)的生成 我们往往在发生内存溢出的时候, 我相信我们的日志信息是可以看到报错信息, 我相信大家的英文水平也是可以看出来是内存泄漏了(嘿嘿), 但是如果你的项目文件是200w行的代码, 我想问你, 你怎么定位你具体哪里的内存文件溢出了呢? -- 懵逼的状态, 无从下手 首先, 我们需要通过jdk自带的命令, 把我们此刻, 内存中的信息抓取出来, 就是你内存中现在是什么样子的, 比如你内存是2G, 你抓取出来的文件大小, 应该大概也是有2G左右的, , 使用jmap命令生成. jmap -dump:live,format=b,file=heap-dump.bin <pid> 其中, pid是JVM进程的id, heap-dump.bin是生成文件的名称. 在JVM中增加参数生成 在JVM的配置参数中可以添加 -XX:

Android 常用开源框架源码解析 系列 (六)LeakCanary 性能优化框架

落花浮王杯 提交于 2020-05-08 21:10:06
一、前言 性能优化 是衡量 我们app质量的一个很大标准 几大影响性能的问题: UI卡顿 ——主线程耗时操作过多 ANR——主线程耗时操作过多 内存泄漏 OOM 内存溢出——图片处理 启动速度 内存泄漏 特点: 不易察觉,不易发现 长时间不断累积会导致OOM内存溢出 内存泄漏出现的原因 Java虚拟机 会自动提供一套GC垃圾回收机制。在其内部会自动进行便利无用引用对象而进行内存的清理工作。 其根本原因是:较长生命周期的对象持有了较短生命周期的引用导致较短生命周期对象无法被垃圾回收器回收。 GcRoots 垃圾收集器 (Garbage Collector) 的对象 可达性算法-分析对象是否存活 从GcRoots结点作为起点,向下依次搜索,搜索走过的路径被称为引用链。当一个对象达到没有任何与GcRoots 引用链相连的时候,就说明该对象是不可用的,该对象就是Gc可回收对象。 Gc回收的对象: 没有被GcRoots 引用的对象 Java中的4种引用 强引用 如果一个对象是通过一串强引用链相连的 它就不能被回收。JVM即时报错OOM也不会回收强引用对象 软引用 -soft 优先级低于强引用,在内存足够的情况下,他和强引用的效果一致。但是如果出现内存不足的情况,Gc垃圾回收就会回收掉软引用对象。 弱引用 -weak 不会强制对象保存到内存当中,优先级低于软引用。Gc回收器必回收对象之一。

java OutOfMemoryError排查

折月煮酒 提交于 2020-05-03 20:30:45
一,什么是OOM,原因有哪些 OOM也叫内存溢出,导致OutOfMemoryError异常的常见原因有以下几种: 内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收; 代码中存在死循环或循环产生过多重复的对象实体; 使用的第三方软件中的BUG; 启动参数内存值设定的过小; 二,通过一个案例定位排查 首先,看一下产生OOM的代码,它的语义是无限往集合中添加元素 import java.util.*; public class OomTest{ public static void main(String [] args){ List<String> list = new ArrayList<String>(); while(true){ list.add(new String("test")); } } }   首先介绍下用到的日志的概念以及工具: Heap Dump是什么? Heap Dump也叫堆转储文件,是一个Java进程在某个时间点上的内存快照。Heap Dump是有着多种类型的。不过总体上heap dump在触发快照的时候都保存了java对象和类的信息。通常在写heap dump文件前会触发一次FullGC,所以heap dump文件中保存的是FullGC后留下的对象信息。 IBM heapAnalyzer:

开发常用工具及文章整理【长期更新】

瘦欲@ 提交于 2020-02-28 04:13:47
开发工具整理: Ubuntu上安装Navicat 安装navicat: https://blog.csdn.net/qq_38276669/article/details/82288870 破解navicat: https://www.jianshu.com/p/fbd9bb9ac144 画图工具:Xmind/ProcessOn Xmind官网地址: https://www.xmind.cn ProcessOn在线作图地址: https://www.processon.com Linux(Ubuntu)下面SecureCRT 完全破解: https://www.cnblogs.com/tfanalysis/articles/4534394.html 获取IDEA破解版: 破解版: https://blog.csdn.net/animatecat/article/details/81483174 IDEA教程使用: https://blog.csdn.net/qq_35246620/article/details/61191375 https://blog.csdn.net/RobertoHuang/article/details/75042116 https://blog.csdn.net/qq_27093465/article/details/68961393

JVM性能调优的6大步骤,及关键调优参数详解

好久不见. 提交于 2019-12-14 16:44:06
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。 1.Full GC 会对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个堆进行回收,所以比较慢,因此应该尽可能减少Full GC的次数。 2.导致Full GC的原因 1)年老代(Tenured)被写满 调优时尽量让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象 。 2)持久代Pemanet Generation空间不足 增大Perm Gen空间,避免太多静态对象 , 控制好新生代和旧生代的比例 3)System.gc()被显示调用 垃圾回收不要手动触发,尽量依靠JVM自身的机制 在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节,下面详细介绍对应JVM调优的方法和步骤。 JVM性能调优方法和步骤 1.监控GC的状态 使用各种JVM工具,查看当前日志,分析当前JVM参数设置,并且分析当前堆内存快照和gc日志,根据实际的各区域内存划分和GC执行时间,觉得是否进行优化。 举一个例子: 系统崩溃前的一些现象: 每次垃圾回收的时间越来越长,由之前的10ms延长到50ms左右,FullGC的时间也有之前的0.5s延长到4

Java GC机制及原理 项目实际遇到GC问题解决思路和经验总结

╄→гoц情女王★ 提交于 2019-12-02 07:49:58
1.什么是GC及基础知识介绍 GC(Garbage Collection) 简称垃圾收集 垃圾回收 JVM运行时数据区: 1.方法区存储类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等 2.堆(heap)存储对象的信息,分为新生代(Eden,Survivor1,Survivor2)和老年代,永久代 3.程序计数器,存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对于程序计数器是不会发生内存溢出现象(OutOfMemory)的 4.Java栈(stack)是Java方法执行的内存模型 5.本地方法栈则是为执行本地方法(Native Method)服务的 2. 垃圾回收策略 讲到垃圾回收,那么什么时候对象需要回收,如何去判断对象是存活还是死亡,我们采用引用计数法来判断对象是否存活,当一个对象被引用时,计数器值加1,当引用失效时减1. 强引用与弱引用的区别: 强引用:类似Object obj = new Object();只要强引用还存在,垃圾回收器不会收集被引用的对象 软引用:用来描述还有用但非必需的对象 通过可达性分析算法来判断对象是否需要被回收 垃圾回收策略有 标记清除法(会产生过多的内存碎片),复制法(内存使用率不高),标记整理法 垃圾收集器分类 Serial收集器:发展历史最悠久的收集器 ParNew收集器 Minor GC &