JVM執行Java程序的過程中管理的內存空間
程序計數器(Program CounterRegister)
· 線程私有
· 線程所執行代碼行號指示器
· 解釋器通過計數器的值選擇下一條執行的字節碼指令
· 線程執行Native方法時值為空
· 沒有OOM(OutOfMemory)
· 線程私有
· 棧幀
· 局部變量表
· 存在StackOverflowError和OOM
· StackOverflowError
· OOM
StackOverflowError例子
/**
*
*
* @author Alfred Xu <>
*
*/
public class StackSOF {
int recursionLength;
void recusion() {
recursionLength++;
recusion();
}
public static void main(String[] args) {
StackSOF sof = new StackSOF();
try {
sof
} catch (Throwable e) {
System
e
}
}
}
OOM例子
/**
*
*
* @author Alfred Xu <>
*
*/
public class StackOOM {
static class Tester extends Thread {
@Override
public void run() {
try {
Thread
} catch (InterruptedException e) {
e
}
}
}
public static void main(String[] args) {
for (int i =
new Tester()
System
}
}
}
本地方法棧(Native MethodStacks)
· 線程私有
· 服務Native方法
· 同樣存在StackOverflowError和OOM
· Hotspot中將Java虛擬機棧和本地方法棧合二為一
Java堆(Java Heap)
· 所有線程共享
· 儲存對象實例
· GC和OOM的主要區域
Heap OOM例子
/**
*
*
* @author Alfred Xu <>
*
*/
public class HeapOOM {
public static void main(String[] args) {
List<Long> list = new ArrayList<Long>();
for (long i =
list
System
}
}
}
方法區(Method Area)
· 又叫非堆(Non
· 所有線程共享
· 儲存VM加載的類信息
· 也有OOM
· 包含運行時常量池(Rumtime ConstantPool)
常量池溢出例子
/**
*
*
* @author Alfred Xu <>
*
*/
public class ConstantPoolOOM {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
for (int i =
list
System
}
}
}
本機直接內存(Direct Memory)
· 不受VM直接管理
· 和NIO中的DirectByteBuffer相關
· 默認和Java堆大小一致
例子
/**
*
*
* @author Alfred Xu <>
*
*/
@SuppressWarnings(
public class DirectMemoryOOM {
static final int _
static void unsafeAllocate() throws IllegalArgumentException
IllegalAccessException {
Field unsafeField = Unsafe
unsafeField
Unsafe unsafe = (Unsafe) unsafeField
List<Long> list = new ArrayList<Long>();
for (int i =
long l = unsafe
list
System
}
}
static void byteBufferAllocate(boolean direct) {
List<ByteBuffer> list = new ArrayList<ByteBuffer>();
for (int i =
ByteBuffer bb;
if (direct) {
bb = ByteBuffer
} else {
bb = ByteBuffer
}
list
System
}
}
public static void main(String[] args) throws IllegalArgumentException
IllegalAccessException {
byteBufferAllocate(true);
// unsafeAllocate();
}
}
Hotspot Java內存空間結構
新生代(Young Generation)
大部分的對象的內存分配和回收在這裡完成
Eden
新建的對象分配在此
Survivor
存儲至少經過一次GC存活下來的對象
From Space
在minor GC後被清空
To Space
Eden中在新生代GC後存活的對象放在此
老生代(Old Generation)
多次GC後存活的對象或者新生代放置不下的大對象
永生代(PermanentGeneration)
方法區
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25843.html