态度决定一切

0%

运行时数据区

程序计数器


注:线程私有

虚拟机栈


注:线程私有

阅读全文 »

转载自:传送门

前面的文章详细讲述了分析Thread Dump文件,实际在处理Java内存泄漏问题的时候,还需要分析JVM堆转储文件来进行定位

JVM Heap Dump(堆转储文件)的生成

正如Thread Dump文件记录了当时JVM中线程运行的情况一样,Heap Dump记录了JVM中堆内存运行的情况。
可以通过以下几种方式生成Heap Dump文件:

使用 jmap 命令生成

jmap 命令是JDK提供的用于生成堆内存信息的工具,可以执行下面的命令生成Heap Dump:

阅读全文 »

转载自:传送门

症状及解决方案

下面列出几种常见的症状即对应的解决方案:

CPU占用率很高,响应很慢

按照《Java内存泄漏分析系列之一:使用jstack定位线程堆栈信息》中所说的方法,先找到占用CPU的进程,然后再定位到对应的线程,最后分析出对应的堆栈信息。
在同一时间多次使用上述的方法,然后进行对比分析,从代码中找到问题所在的原因。如果线程指向的是”VM Thread”或者无法从代码中直接找到原因,就需要进行内存分析,具体的见下一篇文章。

阅读全文 »

转载自:传送门

这篇文章首先对Thread Dump日志文件的结构进行分析

一个典型的thread dump文件主要由一下几个部分组成:

上图将JVM上的线程堆栈信息和线程信息做了详细的拆解

第一部分:Full thread dump identifier

这一部分是内容最开始的部分,展示了快照文件的生成时间和JVM的版本信息。

1
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.151-b12 mixed mode):
阅读全文 »

转载自这里

上线的系统升级之后,出现了严重的高CPU的问题

基本概念

在对Java内存泄漏进行分析的时候,需要对jvm运行期间的内存占用、线程执行等情况进行记录的dump文件,常用的主要有thread dump和heap dump。

  • thread dump 主要记录JVM在某一时刻各个线程执行的情况,以栈的形式显示,是一个文本文件。通过对thread dump文件可以分析出程序的问题出现在什么地方,从而定位具体的代码然后进行修正。thread dump需要结合占用系统资源的线程id进行分析才有意义。
  • heap dump 主要记录了在某一时刻JVM堆中对象使用的情况,即某个时刻JVM堆的快照,是一个二进制文件,主要用于分析哪些对象占用了太对的堆空间,从而发现导致内存泄漏的对象。

上面两种dump文件都具有实时性,因此需要在服务器出现问题的时候生成,并且多生成几个文件,方便进行对比分析。下面我们先来说一下如何生成 thread dump。

阅读全文 »

JVM参数类型

  • 标准参数
  • X 参数
  • XX 参数

标准参数

  • -help
  • -server :选择 “server” VM,默认 VM 是 server,因为您是在服务器类计算机上运行
  • -client
  • -version :输出产品版本并退出
  • -showversion :输出产品版本并继续
  • -cp :<目录和 zip/jar 文件的类搜索路径>
  • -classpath:<目录和 zip/jar 文件的类搜索路径>用 : 分隔的目录, JAR 档案和 ZIP 档案列表, 用于搜索类文件。
阅读全文 »

java中提供了四个级别的引用:

  1. 强引用(Final Reference)
  2. 软引用(Soft Reference)
  3. 弱引用(Weak Reference)
  4. 虚引用(Phantom Reference)

这四个引用定义在java.lang.ref的包下

阅读全文 »