1. 程式人生 > >深入理解JVM學習筆記(三十、JVM 記憶體分配----逃逸分析與棧上分配)

深入理解JVM學習筆記(三十、JVM 記憶體分配----逃逸分析與棧上分配)

一、概念

我們之前提到過,JVM堆已經不是物件記憶體分配的唯一選擇。

棧上分配就是java虛擬機器提供的一種優化技術,基本思想是對於那些執行緒私有的物件(指的是不可能被其他執行緒訪問的物件),可以將它們打散分配在棧上,而不是分配在堆上。分配在棧上的好處是可以在函式呼叫結束後自行銷燬,而不需要垃圾回收器的介入,從而提供系統的效能。

棧上分配的一個技術基礎是進行逃逸分析。逃逸分析的目的是判斷物件的作用域是否有可能逃逸出函式體,只有在方法體內有效的物件才認為物件沒有發生逃逸,反之則認為物件發生了逃逸。

二、發生逃逸情況(程式碼示例)

package com.zjt.test.jvm009;

public class Main {
	public Main m;
	/**
	 * 方法返回物件例項,說明物件m發生了逃逸
	 * @return
	 */
	public Main getInstance() {
		return null == m ? new Main() : m ; 
	}
	
	/**
	 * 為成員屬性賦值,物件m發生逃逸
	 */
	public void setM() {
		this.m = new Main();
	}
	
	/**
	 * 方法體內的物件m1作用域僅在當前方法體有效,因此m1未發生逃逸.
	 */
	public void useM(){
		Main m1 = new Main();
	}
	
	/**
	 * 方法體內的物件m2引用成員變數的值,因此m2也發生了逃逸.
	 */
	public void useM2(){
		Main m2 = getInstance();
	}
	

}