作家
登录

Android面试被问到内存泄漏了杂整?

作者: 来源: 2017-12-19 09:15:40 阅读 我要评论


Android面试被问到内存泄漏了杂整?

内存泄漏即该被释放的内存没有被及时邓晔着,一向被某个或某些实例所持有却不再应用导致GC不克不及收受接收。

Java内存分派策略

Java法度榜样运行时的内存分派策略有三种,分别是静态分派,栈式分派,和堆式分派。对应的三种策略应用的内存空间是要分别是静态存储区(也称办法区),栈区,和堆区。

  • 静态存储区(办法区):重要存放静态数据,全局static数据和常量。这块内存在法度榜样编译时就已经分派好,并且在法度榜样全部运行时代都存在。
  • 栈区:当办法履行时,办法内部的局部变量都建立在栈内存中,并在办法停止后主动释放分派的内存。因为栈内存分派是在处理器的指令集傍边所以效力很高,然则分派的内存容量有限。
  • 堆区:又称动态内存分派,平日就是指在法度榜样运行时直接new出来的内存。这部分内存在不实用时将会由Java垃圾收受接收器来负责收受接收。

栈与堆的差别:

在办法体内定义的(局部变量)一些根本类型的变量和对象的引用变量都在办法的┞坊内存平分派。当在一段办法块中定义一个变量时,Java就会在栈中为其分派内存,当超出变量感化域时,该变量也就无效了,此时占用的内存就会释放,然后会被从新应用。

堆内存用来存放所有new出来的对象(包含该对象内的所有成员变量)和数组。在堆平分派的内存,由Java垃圾收受接收治理器来主动治理。在堆中创建一个对象或者数组,可以在栈中定义一个特别的变量,这个变量的取值等于数组或对象在堆内存中的首地址,这个特别的变量就是我们膳绫擎提到的引用变量。我们可以经由过程引用变量来拜访堆内存中的对象或者数组。

举个例子:

  1. public class Sample {     
  2.     int s1 = 0; 
  3.     Sample mSample1 = new Sample();    
  4.   
  5.     public void method() {         
  6.         int s2 = 0; 
  7.         Sample mSample2 = new Sample(); 
  8.     } 
  9.     Sample mSample3 = new Sample();  

结论:

局部变量的根本类型和引用存储在栈内存中,引用的实体存储在堆中。——因它们存在于办法中,随办法的生命周期而停止。

成员变量全部存储于堆中(包含根本数据类型,引用和引用的对象实体)。——因为它们属于类,类对象毕竟要被new出来应用。

懂得了Java的内存分派之后,我们再来看看Java是怎么治理内存。

Java是若何治理内存

内存治理算法:

引用计数无法解决的轮回引用问题如下: 

  1. public void method() {         
  2.         //Sample count=1 
  3.         Sample ob1 = new Sample();         
  4.         //Sample count=2 
  5.         Sample ob2 = new Sample();         
  6.         //Sample count=3 
  7.         ob1.mSample = ob2;         
  8.         //Sample count=4 
  9.         ob2.mSample = ob1;         
  10.         //Sample count=3 
  11.         ob1=
     1/8    1 2 3 4 5 6 下一页 尾页

      推荐阅读

      一周云势:合纵连横竞争加剧,天上地下欢喜冤家

    此次的成功融资让金山云的用户也跟着受益,因为金山云的主流产品将周全降价,个中CDN、云数据库Redis新价动人,降幅最大年夜可达到50%、60%;云办事器价格最大年夜降幅跨越30%;对象存储产品>>>详细阅读


    本文标题:Android面试被问到内存泄漏了杂整?

    地址:http://www.17bianji.com/lsqh/39898.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)