JAVA内存泄漏与常见问题定位
一、内存溢出
OutOfMemoryError:JVM内存过小;程序不严密,产生了过多的垃圾。其解决方法在于:
- 增加JVM的内存大小,特别是对启动参数内存值的设定。
- 从根本上解决Java内存溢出的唯一方法就是修改程序,及时地释放没用的对象,释放内存空间,避免死循环,防止一次载入太多的数据。
二、内存泄漏
内存泄露,是指程序在申请内存并且用完这块内存后(对象不再需要了),没有释放已申请的内存空间。此时会出现内存持续上升的情况,容易导致OOM。在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点:
- 首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;
- 其次,这些对象是无用的,即程序以后不会再使用这些对象。
2.1 定位与解决
- 通过jstat命令进行监视,查看GC总体情况,及各个区的使用率变化。

- 通过jmap定位,生成堆转储快照,查看存活对象,它显示对象数量和占用byte大小。根据存活对象的不正常增长情况,分析程序中哪些地方用到了这种对象,也可以大致推断出可能的内存泄漏处。

- 非正常情况

- -XX:+HeapDumpOnOutOfMemoryError
三、常用工具
3.1 jps
- 查询正在运行的JVM进程。
3.2 jinfo
- 实时查看和调整JVM参数配置,输出JAVA系统环境参数及命令行参数。
- -sysprops
- -flags <参数名>
3.3 jstat
- 实时显示和监控本地或远程JVM中进程中类加载、内存、垃圾收集、JIT编译等数据。
- -class:显示ClassLoader信息
- -compiler:显示JIT编译过的方法、耗时等;-printcompilation:输出已被JIT编译的方法
- -gc、-gcutil、-gccapacity、- gccause
3.4 jstack
生成当前JVM的线程快照,查看线程堆栈信息。
dump文件可以显示死锁信息。
3.5 jmap
查看堆内对象、类加载器、finalizer队列信息。
3.6 jcmd
- 可将具体诊断命令发给JVM,能替换jstack、jmap等工具。
版权声明:本文为weixin_43415481原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。