JVM_1.1_运行时内存区域_堆
运行时内存区域这块,如果不将内存各个区域做什么的了解清楚,后面看的会很累。
之前将JVM运行时内存区域的内容,整理在了一篇文章中。
在后续深入、细致的学习中,整理的内容越来越多,一篇的话,会导致篇幅过长。
所以将《JVM运行时内存区域详解》分为以下几个章节:
这里将《Java虚拟机规范中文版》上传了,点击下面链接,即可下载
目录
《Java Virtual Machine Specification Java SE 7 中文版》
《Java Virtual Machine's Internal Architecture》
堆
《深入理解Java虚拟机:JVM高级特性与最佳实践》
Java堆是Java虚拟机所管理的内存中最大的一块。Java堆是线程共享的,在虚拟机启动时创建;
此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
但随着技术发展,所有对象都在堆上分配也渐渐变得不那么"绝对"了;
Java堆是垃圾搜集器管理的主要区域,因此很多时候也被称作"GC堆"。
从内存回收的角度来看,由于目前垃圾收集器都采用分代收集算法,所以 堆 还可以细分为:新生代 和 老年代。
不过无论如何划分,都与存放内容无关,无论是哪个区域,存储的都是对象实例。
进一步划分的目的是为了更好地回收内存,或者更快的分配内存。
《Java Virtual Machine Specification Java SE 7 中文版》
在Java虚拟机中,堆(Heap)是可供各条线程共享的运行时内存区域,也是供所有类实例和数组对象分配内存的区域。
Java堆在虚拟机启动的时候就被创建,它存储了被自动内存管理系统(垃圾搜集器)所管理的各种对象。
(本规范中所描述的 Java 虚拟机并未假设采用什么具体的技术去实现自动内存管理系统。虚拟机实现者可以根据系统的实际需要来选择自动内存管理技术。)
Java堆的容量是固定大小的,也可以随着程序执行的需求动态扩展,并在不需要过多空间时自动收缩。
Java堆所使用的内存不需要保证是连续的。
注: 如果实际所需的堆超过了自动内存管理系统能提供的最大容量,那 Java 虚拟机将会抛出一个OutOfMemoryError 异常。
《Java Virtual Machine's Internal Architecture》
在JVM运行时数据区中,堆扮演的是存储公共数据的角色,就好像是电脑中的硬盘。
只有正在运行的Java应用程序中创建类实例或数组,才会在堆中分配内存以存放对象。
扩展
这篇文章中解释的很好,堆就是一个存储单位。(推荐大家可以看下)
http://hllvm.group.iteye.com/group/wiki/2858-JVM