Java内存溢出(OutOfMemory),内存分析相关工具

2023-11-21 17:08

本文主要是介绍Java内存溢出(OutOfMemory),内存分析相关工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[url=http://uglytroll.ycool.com/post.3046111.html]http://uglytroll.ycool.com/post.3046111.html[/url]

1、jconsole
这是java 1.5还是1.6自带的工具
在JDK_HOME\bin\可以找到

GUI的界面让人看起来很舒服

在你的JAVA application运行时,打开它,它会自动搜索正在运行的java程序,不过是用ID的形式显示的,如果你不能确定要分析的是哪一个,点开一个进去查看“VM摘要”项的类路径就可以了

开始以后,就可以查看堆内存的使用状况、线程、CPU、和类的状况,都是用曲线的形式展现的,比较直观,见下图

这个工具的主要作用就是可以直观的观察内存的使用状况,但是却不能做进一步的分析

2、jmap+jhat

下表是Sun官方给出的工具的作用范围

表 1. 为诊断共同的问题使用的工具



问题

症状

诊断工具
内存不足

OutOfMemoryError

Java 堆分析工具 (jhat)
内存泄漏

内存的使用增长
频繁的无用单元回收

Java 监视和管理控制台(jconsole)
JVM 统计监视工具(jstat)


类的增长率很高
类的实例数异常

内存图(jmap)
参见jmap -histo选项


对象被意外引用

jconsole或jmap与jhat
参见jmap -dump选项
Finalizer

对象挂起,无法完成

jconsole
jmap -dump与jhat
死锁

对象监视器或java.util.concurrent锁上的线程阻拦

jconsole
堆栈检索(jstack)
循环线程

线程CPU时间连续地增加

jconsole与JTop
严重的锁争用

线程的争用统计值很高

jconsole

jmap被官方叫做内存图
在你有内存溢出危险的application运行前,在JVM的运行参数后加上-XX:+HeapDumpOnOutOfMemoryError
这样每次你的程序跑到OutOfMemory就会在本地保存一个文件以供你分析,文件的命名形式是java_pidxxxx.hprof,xxxx代表了该进程的id号

有了这个hprof
就可以到cmd下,JDK_HOME\bin\,运行jhat <刚才那个hprof的本地路径>
这样java就给你开了一个web的服务器
运行浏览器在里面输入http://localhost:7000
就可以看到该hprof里面的东西
当然是以类或者其他形式来进行分类的
但是如果你的堆内存过大或者某一项残留的东西较多的时候
很容易搞到浏览器死掉
我是每次必死

所以只好换其他的工具来进行分析
3、java profiler
这种工具很多,你在google里面输入java profiler会出来很多相关的工具
我用的是YourKit Java Profiler 6.0.2


这个东西也有着直观的曲线图和其他一系列分析工具,很强大
可以设置在你OutOfMemory的时候保存一个snapshot在本地

不过这个工具自己抓的snapshot不知道里面是什么东西
分析起来也是云里雾里的
我在这些snapshot上纠结了整整三天,无果

昨天突发奇想用他打开了jmap抓的那个hprof.....
一下子豁然明朗了。。。问题也就迎刃而解
这个工具还有很多很多的功能,用空可以详细的研究一下

以下是这些工具的SUN官方说明:
jps:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html
jstat:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html
jmap:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html
jconsole:http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html


[color=red][color=red]linux下jdk5以上版本[/color],这些工具都是sun自带的,在java/bin/目录下都已经有的,直接命令行就可以使用了。
我曾经实际使用的就是jmap:[b]jmap -histo pid>a.log[/b]不过注意:这个只能在服务已经宕机的情况下使用,实际使用的时候,JVM貌似会整个卡死,这个服务器的其他java进程也全部卡死了,不到万不得已,对在线服务的应用正常情况下还是不要用它。[/color]

这篇关于Java内存溢出(OutOfMemory),内存分析相关工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/403777

相关文章

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

Spring Boot 中 RestTemplate 的核心用法指南

《SpringBoot中RestTemplate的核心用法指南》本文详细介绍了RestTemplate的使用,包括基础用法、进阶配置技巧、实战案例以及最佳实践建议,通过一个腾讯地图路线规划的案... 目录一、环境准备二、基础用法全解析1. GET 请求的三种姿势2. POST 请求深度实践三、进阶配置技巧1

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

Spring Boot 处理带文件表单的方式汇总

《SpringBoot处理带文件表单的方式汇总》本文详细介绍了六种处理文件上传的方式,包括@RequestParam、@RequestPart、@ModelAttribute、@ModelAttr... 目录方式 1:@RequestParam接收文件后端代码前端代码特点方式 2:@RequestPart接

SpringBoot整合Zuul全过程

《SpringBoot整合Zuul全过程》Zuul网关是微服务架构中的重要组件,具备统一入口、鉴权校验、动态路由等功能,它通过配置文件进行灵活的路由和过滤器设置,支持Hystrix进行容错处理,还提供... 目录Zuul网关的作用Zuul网关的应用1、网关访问方式2、网关依赖注入3、网关启动器4、网关全局变

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso

SpringBoot的全局异常拦截实践过程

《SpringBoot的全局异常拦截实践过程》SpringBoot中使用@ControllerAdvice和@ExceptionHandler实现全局异常拦截,@RestControllerAdvic... 目录@RestControllerAdvice@ResponseStatus(...)@Except

Springboot配置文件相关语法及读取方式详解

《Springboot配置文件相关语法及读取方式详解》本文主要介绍了SpringBoot中的两种配置文件形式,即.properties文件和.yml/.yaml文件,详细讲解了这两种文件的语法和读取方... 目录配置文件的形式语法1、key-value形式2、数组形式读取方式1、通过@value注解2、通过

Java 接口定义变量的示例代码

《Java接口定义变量的示例代码》文章介绍了Java接口中的变量和方法,接口中的变量必须是publicstaticfinal的,用于定义常量,而方法默认是publicabstract的,必须由实现类... 在 Java 中,接口是一种抽象类型,用于定义类必须实现的方法。接口可以包含常量和方法,但不能包含实例