jvm 内存泄露排查(visual vm)

刺骨的言语ヽ痛彻心扉 2023-07-20 10:53 76阅读 0赞

jvm 内存泄露排查(visual vm)

内存泄露:对象使用结束,对象所占用的内存空间在垃圾收集的时候却不被回收

原因:对象被长生命周期的变量引用,如static变量

后果:如果大量的对象使用结束却无法回收,就用可能造成内存溢出(无法为新的对象分配内存)

#

***************************

示例

  1. class MyObject{
  2. private int _1m=1024*1024;
  3. private byte[] b;
  4. public MyObject(){
  5. this.b=new byte[_1m];
  6. }
  7. }
  8. public class Test11 {
  9. private static List<MyObject> list=new ArrayList<>();
  10. public static void main(String[] args) throws Exception {
  11. for (int i=0;i<1000;i++){
  12. list.add(new MyObject());
  13. System.out.println("add "+i);
  14. try{
  15. Thread.sleep(1000);
  16. }catch (Exception e){
  17. e.printStackTrace();
  18. }
  19. }
  20. System.out.println(list);
  21. }
  22. }

说明:循环体内创建的对象添加进list中,list为全局变量,方法运行结束后对象也不会被释放,造成内存泄露

********************

控制台输出

虚拟机参数:-Xms500m -Xmx500m

  1. 。。。
  2. add 240
  3. add 241
  4. add 242
  5. add 243
  6. add 244
  7. add 245
  8. add 246
  9. Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
  10. at runtime.MyObject.<init>(Test11.java:12)
  11. at runtime.Test11.main(Test11.java:22)

说明:循环体内创建的对象myObject无法释放,造成内存溢出

***************************

visual vm 内存泄露排查

visual gc标签

  1. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMTYyNQ_size_16_color_FFFFFF_t_70][]
  2. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMTYyNQ_size_16_color_FFFFFF_t_70 1][]

前后运行期间,老年代使用的空间逐渐增大,最终内存溢出,判断可能造成内存泄露

sampler:heap dump,之后一段时间再执行一次 heap dump

  1. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMTYyNQ_size_16_color_FFFFFF_t_70 2][]

前后两次 heap dump比较

  1. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMTYyNQ_size_16_color_FFFFFF_t_70 3][]
  2. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMTYyNQ_size_16_color_FFFFFF_t_70 4][]

对比发现,MyObject对象明显增多

myObject ==》 open in new tab

  1. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMTYyNQ_size_16_color_FFFFFF_t_70 5][]

myObject references

  1. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMTYyNQ_size_16_color_FFFFFF_t_70 6][]

内存泄露对象在arrayList链表中

发表评论

表情:
评论列表 (有 0 条评论,76人围观)

还没有评论,来说两句吧...

相关阅读