参考:1.JVM Specification: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5
2.《深入理解Java虚拟机》
刚开始看JVM Specification ,说实话由于专业英语不过关,有些关键词总是看不懂意思,后来参考.《深入理解Java虚拟机》方能感悟到JVM的强大。 我们就先从运行时数据区域开始
一.运行时数据区域分配图
The Java Virtual Machine defines various run-time data areas that are used during execution of a program. Some of these data areas are created on Java Virtual Machine start-up and are destroyed only when the Java Virtual Machine exits. Other data areas are per thread. Per-thread data areas are created when a thread is created and destroyed when the thread exits.
JVM在执行程序时定义了多个运行时数据区域,一部分数据区域随 JVM 的创建而创建, 随 JVM 的退出而销毁,
其他的数据区域随单个线程的创建而创建,随单个线程的退出而销毁
二.各数据块介绍
2.1 跟随JVM的数据区域
2.1.1 Heap
<1>JVM的Heap区域是对于所有Thread 都是共享的
<2>Heap 是类的对象和数据分配内存的地方
<3>Heap JVM 的创建而创建, 随 JVM 的退出而销毁
<4>Heap存储对象的存储空间由自动存储管理系统GC来释放,并且对象从来都不是显示的释放。
<5>JVM没有固定的自动内存管理系统,一般根据系统的设计需求采用适合的内存管理系统
<6>Heap 的内存大小可以是固定的 也可以根据需求变化
<7>存放Heap的内存块可以是不连续的
<8>如果根据计算,自动内存管理系统不能提供更多的内存给Heap,JVM将抛出outOFMemoryError
2.1.1 Method Area
<1>JVM的Method Area 区域是对于所有Thread 都是共享的
<2>Method Area 类似于:存放传统语言编译后的代码的内存区域 或者 运行系统过程中的文本区域 (第一个例子要好理解点)
它存放单个类的结构如:运行时常量池,字段,方法数据,构造方法和普通方法的代码,同样包括在类中使用的实例、接口初始化的特殊方法。
<3>Method Area 随JVM 的创建而创建, 随 JVM 的退出而销毁
<4>Heap逻辑上是Heap的一部分,但GC并不会对他产生任何影响
<5>暂无针对编译后的代码管理的策略和内存分配方法。
<6>Heap 的内存大小可以是固定的 也可以根据需求变化
<7>存放Heap的内存块可以是不连续的
<8>如果方法区不能满足内存分配请求,JVM将抛出outOFMemoryError