内存溢出和内存泄漏

  

    内存溢出和内存泄漏都的表象都是系统提供的内存空间不足以支撑应用的运行,但两者的实质是不同的。前者可以理解为进入虚拟机的资源总量比出去的资源总量多,占用内存的速率要快于垃圾回收的速率,

  这有可能是正常的因为逻 辑,也有可能是设计上的缺陷;后者可以理解为进行虚拟机的某些资源存在引用并且无法被垃圾回收,虚拟机失去了对这部分资源的回收能力。

  1、内存溢出

    内存溢出的原因是堆的大小无法承载内部的对象和数组了。这个问题简单的说,可以从两个方面来解决。一是代码中减少不必要的实例构造,这个途径会直接提高项目的性能。二是调整堆的大小,

  -Xms是设置堆的最小空间的参数,-Xmx是设置堆的最大空间的参数。对于新生代,空间的设置参数为-XX:NewSize和-XX:MaxNewSize,当-Xms和-Xmx的值相同时,可以使用参数-Xmm来简化。

  对于永生代(SUN虚拟机对应的是方法区)的设置,初始空间参数为:-XX:PermSize,最大空间参数为:-XX:MaxPermSize。注意,虚拟机一旦启动,堆的大小就被固定,无法动态调整。

  2、内存泄漏

    内存泄漏的原因是垃圾器无法对存在无效引用的对象进行回收导致的内存溢出。内存泄漏没有办法通过设置虚拟机参数来解决,因为导致这一问题的原因来自编码阶段,比如资源在使用完毕后没有是释放。

  解决这一问题的办法是改进代码或者变更依赖包,发现问题的途径不一而足,通常是通过分析工具来排查泄露点。

    常用发分析工具如下:

    

    

    

    

原文地址:https://www.cnblogs.com/shaosks/p/8487063.html