标签:堆内存 pid 切换 map 增加 分析 网页 性能分析 grep
一:heap dump 1、heapdump:记录内存信息的,heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况, heapdump文件是指定时刻的Java堆栈的快照,是一种镜像文件。 2、产生heapdump(内存溢出)错误原因一般出于以下原因: 1)JVM内存过小。 2)程序不严密。 3)产生过多的垃圾无法回收。 3、heapdump文件如何生成? 使用 jmap 命令生成: jmap 命令是JDK提供的用于生成堆内存信息的工具,切换到JDK_HOME/bin目录下后,执行下面的命令生成Heap linux环境: ./jmap -dump:live,format=b,file=heap.hprof <pid> 其中pid是JVM进程的id,heap.hprof是生成的heap dump文件,在执行命令的目录下面。推荐此种方法。 如果我们只需要将dump中存活的对象导出,那么可以使用:live参数 jmap -dump:live,format=b,file=heapLive.hprof 2576 4、常见heapdump文件分析工具:jhat jhat 是JDK自带的用于分析JVM Heap Dump文件的工具,使用下面的命令可以将堆文件的分析结果以HTML网页的形式进行展示: jhat <heap-dump-file> 其中 heap-dump-file 是文件的路径和文件名,可以使用 -J-Xmx512m 参数设置命令的内存大小。执行成功之后显示如下结果: 这个时候访问 http://localhost:7000/ 即可以看到结果了。 考虑到生产环境中几乎不可能在线对其进行分析,大都是采用离线分析,因此使用jmap+MAT工具最常见最科学的组合。 二:thread dump 1、threaddump:记录CPU信息。 thread dump文件主要保存的是java应用中各线程在某一时刻的运行的位置,即执行到哪一个类的哪一个方法哪一个行上。 thread dump是一个文本文件,打开后可以看到每一个线程的执行栈,以stacktrace的方式显示。 通过对thread dump的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,如数据库查询,长期得不到响应,最终导致系统崩溃。 单个的thread dump文件一般来说是没有什么用处的,因为它只是记录了某一个绝对时间点的情况。 比较有用的是,线程在一个时间段内的执行情况。 2、获取thread dump文件 linux下执行:./jstack 2576 > thread.txt linux则会将命令执行结果转储到thread.txt,这就是thread dump文件。 有了dump文件后,我们就能借助性能分析工具获取dump文件中的信息。 3、发现pid 4430 4431 4432 4433 线程分别占用了约40%的cpu,将这几个pid转为16进制,分别为114e 114f 1150 1151 查询(pid转为16进制)中对应的线程情况(cat 1.txt|grep 114f)。 三: 在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(Garbage Collection,GC)完成的,程序员不需要通过调用函数来释放内存。 导致内存泄漏主要的原因是,先前申请了内存空间而忘记了释放。内存管理中的内存泄漏产生的主要原因:保留下来却永远不再使用的对象引用。 一般说来,一个正常的系统在其运行稳定后其内存的占用量是基本稳定的,不应该是无限制的增长的。 在应用程序中出现了OutOfMemoryError。在这种情况下,需要使用一些开销较低的工具来监控和查找内存泄漏。 虽然OutOfMemoryError也有可能应用程序确实正在使用这么多的内存;对于这种情况则可以增加JVM可用的堆的数量,或者对应用程序进行某种更改,使它使用较少的内存。
标签:堆内存 pid 切换 map 增加 分析 网页 性能分析 grep
原文地址:https://www.cnblogs.com/k8s-pod/p/13974379.html