JVM 内存泄漏

发布时间 2023-10-31 21:41:48作者: 小九讲测试
什么是内存泄漏
     内存泄漏一般可以理解为系统资源在错误使用的情况下,导致使用完毕的资源无法回收(或没有回收),从而可能导致资源被耗尽引起系统错误。内存泄漏对系统危害比较大,因为他可以直接导致系统的崩溃。
     内存泄漏和系统超负荷两者是有区别的,虽然可能导致的最终结果是一样的。
     内存泄漏是用完的资源没有回收引起错误,而系统超负荷则是系统确实没有那么多资源可以分配了。
     内存泄漏可以通过软件调优解决,单系统超负荷则需要通过更新硬件来解决
 
内存泄漏的表现
  • 内存快被占满,但还没占满,处于临界点,这时候不会有报错,但会影响性能
  • 日志里明确产生OOM等提示(可通过tail命令查看catalina.out文件)如下图所示,回落点(我常说是屁股)连起来基本水平说明正常回收,相反则可能是回收不彻底,有风险。
  •  

    常见的内存泄漏
     
         1.堆内存泄露
     
         发生在堆内存的泄露,查看内存示意图,趋势为上涨;明确发生内存泄漏时日志中可看出报错:
     
    信息: Stopping service Catalina
     
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
     
         2.持久代内存泄漏(非堆)
    报错信息:ava.lang.OutOfMemoryError:permGen space
         参见JVM参数调优之非堆参数,XX:PermSize,XX:MaxPermSize
     
         3.栈溢出
    报错信息:ava.lang.stack over flower error
    或stack size too small
         -Xss 线程栈大小,默认值1M,一般不用改。如果要改,建议不要超过2M
     
         4.系统内存不足(不属于JVM内存泄漏范畴)
    报错信息:java.lang.OutOfMemoryError: unable to create new native thread