内存泄漏即该被释放的内存没有被及时邓晔着,一向被某个或某些实例所持有却不再应用导致GC不克不及收受接收。
Java内存分派策略
Java法度榜样运行时的内存分派策略有三种,分别是静态分派,栈式分派,和堆式分派。对应的三种策略应用的内存空间是要分别是静态存储区(也称办法区),栈区,和堆区。
- 静态存储区(办法区):重要存放静态数据,全局static数据和常量。这块内存在法度榜样编译时就已经分派好,并且在法度榜样全部运行时代都存在。
- 栈区:当办法履行时,办法内部的局部变量都建立在栈内存中,并在办法停止后主动释放分派的内存。因为栈内存分派是在处理器的指令集傍边所以效力很高,然则分派的内存容量有限。
- 堆区:又称动态内存分派,平日就是指在法度榜样运行时直接new出来的内存。这部分内存在不实用时将会由Java垃圾收受接收器来负责收受接收。
栈与堆的差别:
在办法体内定义的(局部变量)一些根本类型的变量和对象的引用变量都在办法的┞坊内存平分派。当在一段办法块中定义一个变量时,Java就会在栈中为其分派内存,当超出变量感化域时,该变量也就无效了,此时占用的内存就会释放,然后会被从新应用。
堆内存用来存放所有new出来的对象(包含该对象内的所有成员变量)和数组。在堆平分派的内存,由Java垃圾收受接收治理器来主动治理。在堆中创建一个对象或者数组,可以在栈中定义一个特别的变量,这个变量的取值等于数组或对象在堆内存中的首地址,这个特别的变量就是我们膳绫擎提到的引用变量。我们可以经由过程引用变量来拜访堆内存中的对象或者数组。
举个例子:
- public class Sample {
- int s1 = 0;
- Sample mSample1 = new Sample();
- public void method() {
- int s2 = 0;
- Sample mSample2 = new Sample();
- }
- }
- Sample mSample3 = new Sample();
结论:
局部变量的根本类型和引用存储在栈内存中,引用的实体存储在堆中。——因它们存在于办法中,随办法的生命周期而停止。
成员变量全部存储于堆中(包含根本数据类型,引用和引用的对象实体)。——因为它们属于类,类对象毕竟要被new出来应用。
懂得了Java的内存分派之后,我们再来看看Java是怎么治理内存。
Java是若何治理内存
内存治理算法:
引用计数无法解决的轮回引用问题如下:
- public void method() {
- //Sample count=1
- Sample ob1 = new Sample();
- //Sample count=2
- Sample ob2 = new Sample();
- //Sample count=3
- ob1.mSample = ob2;
- //Sample count=4
- ob2.mSample = ob1;
- //Sample count=3
- ob1=
推荐阅读
此次的成功融资让金山云的用户也跟着受益,因为金山云的主流产品将周全降价,个中CDN、云数据库Redis新价动人,降幅最大年夜可达到50%、60%;云办事器价格最大年夜降幅跨越30%;对象存储产品>>>详细阅读
本文标题:Android面试被问到内存泄漏了杂整?
地址:http://www.17bianji.com/lsqh/39898.html
1/2 1