1、JVM 运行时数据区
所有线程共享的数据区:方法区(持久代)、堆区
线程隔离的数据区:程序计数器、Java虚拟机栈区
堆区构成:新生代 ( 由Eden, From Survivor, To Survivor 构成)、老生代
运行时常量池:方法区一部分,用于存放编译期生成的各种字面量和符号引用
直接内存:不是JVM 运行时数据区的一部分,不受Java堆大小限制,但是受物理内存限制,也会抛出 OutOfMemoryError。Java NIO 中的DirectByteBuffer 使用了直接内存。
2、OutOfMemoryError 案例
(1)、堆溢出
在对象数量达到最大堆容量限制后,发生堆内存溢出异常 OutOfMemoryError: Java heap space 。
JVM配置:
-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
代码:
public static void main(String[] args) {
List<Object> list = new LinkedList<Object>();
for(int i=0;i<Long.MAX_VALUE;i++)
{
list.add(new XX());
}
}
输出:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Dumping heap to java_pid4192.hprof ...
Heap dump file created [37582435 bytes in 0.265 secs]
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exc