当前位置:   article > 正文

JAVA内存泄漏与常见问题定位_jvm内存溢出该如何定位解决

jvm内存溢出该如何定位解决

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等工具。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/205355
推荐阅读
相关标签
  

闽ICP备14008679号