JAVA内存泄漏与常见问题定位


JAVA后端开发知识总结(持续更新…)


JAVA内存泄漏与常见问题定位



一、内存溢出

OutOfMemoryError:JVM内存过小;程序不严密,产生了过多的垃圾。其解决方法在于:

  1. 增加JVM的内存大小,特别是对启动参数内存值的设定。
  2. 根本上解决Java内存溢出的唯一方法就是修改程序,及时地释放没用的对象,释放内存空间,避免死循环,防止一次载入太多的数据。

二、内存泄漏

内存泄露,是指程序在申请内存并且用完这块内存后(对象不再需要了),没有释放已申请的内存空间。此时会出现内存持续上升的情况,容易导致OOM。在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点:

  1. 首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;
  2. 其次,这些对象是无用的,即程序以后不会再使用这些对象。

2.1 定位与解决

  1. 通过jstat命令进行监视,查看GC总体情况,及各个区的使用率变化。

在这里插入图片描述

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

在这里插入图片描述

  • 非正常情况
    在这里插入图片描述
  1. -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

3.6 jcmd

  • 可将具体诊断命令发给JVM,能替换jstack、jmap等工具。

版权声明:本文为weixin_43415481原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。