几个月前老大给我们培训了怎么样使用jmap和jhat来检查系统是否存在内存泄露,这两天突然想起应该自己动手实验一番,再记录下来。
首先在实验之前,先给大家介绍几个jdk自带的工具:
1. jps 查看所有java进程的pid的命令,与Unix的ps命令类似
2. jmap 打印出某个java进程(使用pid)内存内的所有‘对象’的情况
3. jhat 主要用于分析jmap产生的dump并提供web页面查看分析结果
4. jconsole 可以查看堆内存、线程、类和CPU状况
为了实验,所以必须先写一段存在内存泄露的代码,代码如下:
/**
* 内存泄露测试
* @author crane.ding
*/
public class MemoryLeakDemo {
static List<int[]> cache = new ArrayList<int[]>();
public static void main(String[] args) throws InterruptedException {
Thread.currentThread().setName("Memory Leak Thread");
do {
cache.add(new int[1024 * 50]);// 50Kb
Thread.sleep(500);
} while(true);
}
}
首先运行MemoryLeakDemo,然后进行控制台,使用jconsole命令来观察其运行情况
# jconsole
图一
如图一,可以看出内存是一直往上升的,点击‘执行gc’按钮,效果不明显,还是继续上升,从这里可以看出点小问题。这是我们可以使用jmap来打印其内存对象的情况,和使用jhat显示内存和查询内存的情况
# jps
3704 MemoryLeakDemo
3280
3768 Jps
# jmap -dump:format=b,file=heap.bin 3704
Dumping heap to D:\Program Files\Cygwin\home\crane.ding\heap.bin ...
Heap dump file created
# jhat heap.bin
Reading from heap.bin...
Dump file created Sun Jul 18 13:36:46 CST 2010
Snapshot read, resolving...
Resolving 3985 objects...
Chasing references, expect 0 dots
Eliminating duplicate references
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
jhat已经启动了HTTP server在本地的7000端口,那么我们可以通过浏览器来打开页面(http://127.0.0.1:7000/),我们可能需要花一些时间就能在分析解释中找到问题,com.craneding.MemoryLeakDemo类中有一个变量名为cache的ArrayList,保存了大量的int数组,我们在结合代码,查找操作该对象的代码,从而发现代码的问题。这就是一次简单的实验,经过这次实验,我发现jhat显示的分析结果还不是很直观,后来发现原来eclipse用一个查看jmap结果的插件Memory Analyzer(http://download.eclipse.org/mat/1.0/update-site/),安装了之后,eclispe可以直接打开heap.bin文件如下图:
点击‘Problem Suspect 1’中的‘Detail’,查看详情,这个时候就可以很直观的看到对象的情况了,如下图:
图中清楚的显示了ArrayList里面的对象和对象的占用内存大小等情况,从而再结合代码去查找问题,很快就能找到问题。
在条件允许的条件下,使用Memory Analyzer来分析jmap的分析结果会比较直观。
- 大小: 40.4 KB
- 大小: 61.6 KB
- 大小: 113.1 KB
分享到:
相关推荐
- **使用场景**:当怀疑应用程序存在内存泄漏时,使用 jmap 生成 heap dump 文件,进一步通过其他工具(如 MAT 或 VisualVM)进行分析。 - **命令格式**:`jmap [options] <pid>` 或 `jmap [options] core` ##### 5...
13. **jvisualvm综合监测工具**:集成了许多JDK自带的监测工具,提供更友好的图形界面,可以进行性能分析、内存检测、线程检查等。 这些工具是Java开发者的日常利器,通过深入理解和熟练运用,能够提高开发效率,...
### Java内存泄露、溢出检查方法及工具详解 #### 一、引言 在实际的项目开发和运维过程中,经常会遇到Java应用程序出现内存溢出(`java.lang.OutOfMemoryError`)的情况。这类问题不仅影响应用程序的稳定性和性能...
安装“jdk-17_windows-x64_bin.exe”后,需要设置环境变量JAVA_HOME指向JDK的安装目录,并将`bin`子目录添加到系统PATH变量中,以便在命令行中全局使用JDK工具。 5. **开发与调试**: 使用JDK 17,开发者可以利用...
Tomcat内存泄漏是Java应用服务器在运行过程中常见的问题,它可能导致系统性能下降,服务不稳定,甚至引发系统崩溃。解决这个问题需要深入理解Tomcat的内存管理机制以及如何诊断和修复内存泄漏。以下是对“tomcat内存...
本文主要探讨了Java内存溢出的检查方法和工具,以及内存泄露的基本原理。 首先,当Java应用程序抛出`java.lang.OutOfMemoryError`异常,通常意味着JVM的内存使用超过了预设的限制。JVM内存分为几个区域,包括新生代...
- **栈溢出**:如果发生栈溢出异常 (`StackOverflowError`),则需要检查递归调用或循环是否存在问题,或者适当增加 `-Xss` 参数的值来增大栈空间。 #### 五、监控与诊断 为了更好地理解和分析 Java 应用程序的运行...
Java Development Kit(JDK)是Oracle公司提供的用于开发和运行Java应用程序的重要工具包。JDK 7是Java的一个重要版本,引入了许多新特性、优化和改进,为开发者提供了更高效和强大的编程环境。在Windows系统上安装...
Java开发工具包(Java Development Kit,简称JDK)是Oracle公司提供的用于开发和运行Java应用程序的软件包。它是Java程序员的基础工具,包含了编译、调试、文档生成等所需的组件和库。在本压缩包"jdk安装包-java开发...
在"jvm内存分析-jdk17-memoryAnalyzer"这个主题中,我们将深入探讨JVM内存结构,特别是针对Java 17版本的内存配置和分析工具Memory Analyzer (MAT)。 JVM内存主要分为以下几个区域: 1. **堆内存**:这是Java程序...
1. **工具选择**:可以使用如VisualVM、JProfiler等工具来监控和诊断内存泄漏问题。 2. **分析策略**:观察内存使用情况,查找不再使用的对象是否仍被引用,以及这些对象占用的空间大小。 3. **代码审查**:检查是否...
- **识别**:通过检查 JVM 参数 `-Xmx` 和 `-Xms` 设置的堆大小是否合理,以及是否存在对象生命周期过长等问题。 - **解决策略**:增加 JVM 的最大堆内存,优化代码减少不必要的大对象创建,调整对象生命周期等。 #...
1. 确认是否存在内存泄露:通过观察系统的内存使用趋势,如果内存持续增长且没有释放,可能是内存泄露。 2. 识别泄露对象:使用内存分析工具查找长期存活且占用内存大的对象。 3. 分析引用链:找到这些对象的引用...
1. **生成dump文件**:当应用出现性能问题时,可以使用JDK自带的`jmap`命令或者操作系统的工具生成堆转储文件。 2. **打开dumpAnalyzer**:导入生成的dump文件到dumpAnalyzer中,启动分析。 3. **分析与诊断**:...
JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的重要工具集。它包含了Java编译器、Java虚拟机(JVM)、Java类库以及各种开发和调试工具。JDK 1.7,也被称为Java 7,是Java平台的一个...
- 配置完成后,可以通过`java -version`命令检查JDK是否安装成功。 总结来说,JDK1.7 Windows 32位是Java开发者的重要工具,它的新特性、性能优化和安全改进为开发带来了便利和效率提升。无论是在开发、调试还是...
选择64位版本的JDK是为了充分利用64位操作系统的内存寻址能力,它可以处理更大的内存空间,对于处理大数据或运行内存消耗较大的应用尤其有利。同时,64位JDK能够运行32位和64位的Java应用程序,但32位JDK只能运行32...
Java Development Kit (JDK) 是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。JDK 1.7(也称为Java 7)是Oracle公司发布的一个重要版本,它引入了许多新特性,优化了性能,...
4. **验证安装**: 安装完成后,通过运行`java -version`和`javac -version`命令来检查JDK是否已正确安装并设置。如果显示JDK 1.8.0_321的版本信息,那么安装成功。 **JDK中的主要工具** - `javac`: Java编译器,将...
JDK 17 是其一个重要的版本,它包含了Java编译器(javac)、Java运行时环境(JRE)、Java调试工具(JDB)、Java文档生成器(Javadoc)以及其他开发工具,如jar工具和appletviewer等。这个版本的发布,旨在提供更稳定...