欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java Gc Java内存泄漏和解决方法,

来源: javaer 分享于  点击 39636 次 点评:250

Java Gc Java内存泄漏和解决方法,


GC:garbage collector垃圾回收器  或者看成garbage collection垃圾回收;

它有三个职责:1.分配内存 2.确保任何被引用的对象都保存在内存中 3.回收不能通过引用关系找到的对象的内存

 

而Java有GC机制,则自动回收;

再说一下Heap和Stack:

  Heap(堆):java运行环境分配给对象的内存,总的来说就是一个应用程序的内存空间;通过垃圾回收机制来释放内存;

  Stack(栈):用来存放短期存在的变量,例如Thread,int a,char b等;符合先进后出的原则,里面的临时变量结束就被释放,更新速度快,堆是栈的一个组成元素;

 

 

内存泄漏举例

 

 有哪些情况会发生内存泄漏:

解决方法:将传入的Context改为ApplicationContext ,这样两个对象的生命周期一样长;

 

 

在Java中,非静态内部类和匿名内部类都会默认持有所属的外部类的引用,而静态内部类不会持有;

所以解决方法1还可以先只改为静态内部类,不采用弱引用;

解决方法1:(改为静态内部类,并弱引用)

使用静态内部类中并以弱引用的方式声明外部类,从而使得短生命周期对象会被回收!!!

 解决方法2:Activity退出消息队列时,清除消息队列中的未处理的消息;

 

线程造成的内存泄漏:

 和Handle类似,也是创建Runnable非静态匿名内部类时,会默认持有外部Activity引用,当Activity销毁之前,

消息还没完成,于是长生命周期持有短生命周期;

 

解决方法:使用静态内部类并以弱引用的方式来申明外部类的引用,以及任务的销毁;

第四种属于资源型对象,不关闭会导致内存泄漏;

 

JVM的GC规则

JVM使用分代式的内存管理方式, 将Heap分成三代 --- 新生代, 老一代, 持久代

 

Young Generation

  • 新生代.
  • 所有new的对象.
  • 该区域的内存管理使用minor garbage collection(小GC).
  • 更进一步分成Eden space, Survivor 0 和 Survivor 1 三个部分.

Old Generation

  • 老年区.
  • 新生代中执行小粒度的GC幸存下来的"老"对象.
  • 该区域的内存管理使用major garbage collection(大GC).

Permanent Generation

  • 持久代.
  • 包含应用的类/方法信息, 以及JRE库的类和方法信息.

 

小GC执行非常频繁,速度也很快;大GC比小GC执行慢几十倍;大小GC执行都会带来程序卡顿,所以解决App卡顿情况时,尽量减少GC次数;

 

每当new一个新的对象,都会送往新生代的EDEN区,eden区满了之后,将引用可达对象送往survivor0,清空eden区,引用不可达对象直接删除,内存回收;当eden区再次满了之后,将引用可达对象送往survivor1中,清空eden区,与此同时,survivor0中的引用可达对象送往survivor1,这些对象的年龄+1,清空s0,将引用不可达对象删除实现内存回收;后面如此规律;最后当年龄到达老年代就会送往那里;

 

虚引用:虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收

 

 

 

相关文章

    暂无相关文章
相关栏目:

用户点评