做者:不洗碗工做室fhyPayasojava
版權歸做者全部,轉載請註明出處android
先看一個例子 : 數組
Person person;
person = new Person("name");複製代碼
上面兩行代碼中,第一行person屬於聲明瞭一個Person類的引用,而第二行的new纔是真正建立了一個對象。bash
Java在JVM所虛擬的內存環境中運行,內存能夠分爲三個部分:棧,堆,方法區ide
棧(stack) 每個線程都擁有一個棧,在這裏只保存基本數據類型和對象的引用(注意和對象的區別),例如在方法中定義一個局部變量,就會在棧中給這個變量分配內存空間,超過該變量的做用域時,這部份內存就會被回收掉。性能
堆(heap) 被全部進程所共享,只存放數組、對象以及對象的成員變量,不包括基本類型和引用,這部份內存空間由java中的垃圾回收機制自動管理。優化
方法區(method) 又叫靜態區,一樣被全部進程所共享,存放class和static變量。ui
舉個例子:this
public class Person {
int age = 18;
Person personA = new Person();
public void method() {
int height = 180;
Person personB = new Person();
}
}
Person personC = new Person();複製代碼
在上面的例子中,height以及引用變量personB都屬於局部變量,因此它們的內存應存放在棧中,在method方法以外的做用域,這部份內存就會被回收,而personB所指向的對象的內存存放在堆上。 引用變量personC所指向的對象同理也存放在堆上,固然也包括Person類的成員變量age和personA,但引用變量personC自己則是存放在棧中。spa
在Java中,內存的分配是由程序來完成的,而內存的回收則是由GC完成的,GC爲了能正確的釋放對象,必須監控每個對象的運行狀態,包括對象的申請、引用、賦值等。對象經過引用的方式來使用,而當一個對象沒有任何引用的時候,稱爲不可到達對象,GC用於回收不可到達對象所佔用的內存。
雖然java中有垃圾回收的機制,能夠自動管理內存分配,可是仍有可能出現內存泄露的狀況。Java做爲Android的主要開發語言,當存在內存泄漏時,APP就會浪費大量內存,當內存不夠時會致使頻繁的內存回收,然而內存回收是十分耗時的操做,這樣就會致使APP的卡頓,嚴重的可能會致使內存溢出,退出程序。
內存泄露的緣由 安卓中主要出現內存泄漏的緣由本質上就是,一個對象已經不會再被使用,但其內存卻沒有被系統所回收,而沒法被回收的緣由通常是因爲該對象被一個生命週期更長的對象所引用。
常見的內存泄漏
static關鍵字所致使的內存泄露
舉個例子:
public class MainActivity extends Activity{
private static Context context;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R,layout.main);
context = this;
}
}複製代碼
context爲靜態變量,生命週期較長,致使當前activity被銷燬後沒法被系統回收,產生內存泄漏。
解決辦法:在Activity的onDestroy方法裏把靜態變量設爲null
protected void onDestroy() {
super.onDestroy();
if(context != null) {
context = null;
}
}複製代碼
本文先初步探究android中的內存泄露的基本原理,其餘具體可能引發內存泄露的情景和解決方法會在後續文章中探討。
參考文章: 《Android 中內存泄漏的緣由和解決方案》http://m.blog.csdn.net/lib739449500/article/details/78741263 《Android常見內存泄露,學會這六招大大優化APP性能》https://www.douban.com/note/609777758/