了解 java 記憶體的配置,有助於程式撰寫的 performance tuning
首先以變數的角度來說明:
1. heap variable:
class variable(method 之外並加上 static 的修飾字)、instance variable、array component。
這類變數會自動被 JVM 初始化成預設值。
2. stack variable:
通稱廣義的區域變數,其佔用的記憶體在 stack 中,這類變數包括了狹義的區域變數(宣告在 method 內的變數)、
method parameter、exception-handler parameter、constructor parameter。此類變數會被 JVM 初始化成傳入值。
而狹義的區域變數不會被 JVM 初始化成預設值,使用者必須自行初始化該變數。
下列是以記憶體的配置來探討:
1. heap (dynamic memory allocate):
是動態配置記憶體空間,且可以隨時配置,由JVM負責。
只要是用new 產生的oject都是存放在heap中,且通常用一個存放在stack的reference 來指向這個oject
compiler 不會知道這個從heap中獲得多少空間,也不會知道其配置到的空間會存放多久。
2. stack (stack allocation):
其 Life cycle 會受到block scope的影響,當進入block時,會自動配置記憶體空間,離開這個SCOPE時,其記憶體配置就會隨之消失。
可以將object的reference 儲存於stack內。
Reference:
http://www.oreilly.com.tw/column_sleepless.php?id=j015
http://www.javaworld.com.tw/jute/
2008年9月22日 星期一
java 的記憶體配置
張貼者: willmaster.liu 於 晚上11:33 0 意見
標籤: java memory
2007年8月28日 星期二
簡易的效能測試方式
以下是一支簡易的 method,可以讓您了解程式的運作花了多少資源, 以便調整.
並介紹 Runtime.getRuntime().maxMemory(), Runtime.getRuntime().totalMemory()
Runtime.getRuntime().freeMemory() 是如何被使用的.
詳細可再參考
透過 Java 參數來改善 Java 效能
public class FreeMemoryTest {
public static void main(String[] args) {
//JVM 能從OS得到最大的記憶體,如果下了 -Xmx 參數,將以該參數為主
long maxMem = Runtime.getRuntime().maxMemory();
//JVM 已經從OS得到可使用的記憶體,會越取越多,直到 maxMemory 的最大容量,超過則會丟出 java.lang.OutOfMemoryError
long totalMem = Runtime.getRuntime().totalMemory();
//目前使用完剩下的記憶體
long startMem = Runtime.getRuntime().freeMemory();
long startTime = System.currentTimeMillis();
for (int i = 0; i <= 10000; i++) {
String str = "foo";
System.out.println(str);
}
long endMem = Runtime.getRuntime().freeMemory();
System.err.println("使用記憶體(Bytes): " + (startMem - endMem));
long endTime = System.currentTimeMillis();
System.err.println("使用時間(毫秒): " + (endTime - startTime));
System.err.println("總共記憶體(Bytes):" + totalMem);
System.err.println("目前最大記憶體(Bytes):" + maxMem);
}
}詳細可再參考
透過 Java 參數來改善 Java 效能
張貼者: willmaster.liu 於 晚上10:59 0 意見
標籤: java memory, java.lang.*
訂閱:
文章 (Atom)