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


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


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


文章目录

  • JAVA内存泄漏与常见问题定位
  • 一、内存溢出
  • 二、内存泄漏
    • 2.1 定位与解决
  • 三、常用工具
    • 3.1 jps
    • 3.2 jinfo
    • 3.3 jstat
    • 3.4 jstack
    • 3.5 jmap
    • 3.6 jcmd


一、内存溢出

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

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

二、内存泄漏

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

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

2.1 定位与解决

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

JAVA内存泄漏与常见问题定位_第1张图片

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

JAVA内存泄漏与常见问题定位_第2张图片

  • 非正常情况
    JAVA内存泄漏与常见问题定位_第3张图片
  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

  • 查看堆内对象、类加载器、finalizer队列信息。

  • 《Java内存分析工具——jmap》

3.6 jcmd

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

你可能感兴趣的:(JVM,jvm,内存泄漏)