Java虚拟机内存管理

转载请注明出处:http://blog.csdn.net/kai_wei_zhang/article/details/8239092


运行时数据区域(如图)



1、对各内存空间的理解 

(1)程序计数器(也叫PC寄存器)Program Counter

是一块较小的内存空间,作用可以看成当前线程所执行的字节码的行号指示器

(2)Java虚拟机栈

虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(方法内部执行则是栈帧内容执行)每个方法的调用直至执行完成的过程,都对应一个栈帧中虚拟机栈中的出入栈过程

该区别规定了两种异常状况:

对固定虚拟机栈大小的:StackOverFlow Error

对可动态扩展的虚拟机栈的:扩展无法申请足够的内存时,OutOfMemory Error 异常

注意:程序计数器占用的可能为CPU寄存器或操作系统内存,虚拟机栈占用的为操作系统内存,当方法执行完毕,其对应的栈帧所占内存自动释放

(3)本地方法栈

本地方法栈用于支持native方法的执行,Sun JDK即Hot Spot虚拟机是实现中的本地方法栈和虚拟机栈是同一个

(4)方法区

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

一定条件下会被GC(常量池的回收和对类的卸载)

内存不足引发OutOfMemory Error异常

说明:运行时常量池是方法区的一部分,一般来说,常量池除了保存Class文件中描述的符号引用外,还有把翻译出来的直接引用

(5)堆

在虚拟机启动时创建。此区域唯一目的就是存放对象的实例。几乎所有对象实例都在这里分配内存,是进行GC的主要区域

补充说明:

1)存在GC的区域有方法区(较少)和堆,但方法区较少也较难对加载的类进行卸载。堆中最多GC

2)方法区默认最小值为16MB最大值为64MB。可通过-XX:PermSize 及 -XX:MaxPermSize指定。

,在32位操作系统上最大为2GB,在64位操作系统上则没有限制,可通过 -Xmx和 -Xms设置JVM启动时申请到的堆(Heap)内存大小

最小默认情况下为物理内存的1/64,小于1GB

最大默认为物理内存的1/4小于1G

默认当空余堆内存小于40%时,JVM会增大Heap到 -Xmx指定的大小。

当空余堆内存大于70%时,JVM会减少Heap到 -Xms指定的大小。

对于运行的系统,为了避免在运行时频繁调整Heap的大小,通常将 -Xms 和 -Xmx 的值设置成一样

2、直接内存

直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,但这部分内存也被频繁地使用,而且也导致了OutOfMemory Error异常的出现

由于JDK1.4加入了NIO类,引入了一种基于通道和缓冲区的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作(避免了Java堆和Native堆中来回复制数据。这样本机直接内存的分配不会受到Java堆大小的限制,但服务器管理员配置虚拟机的参数时,往往忽略了,这使得各个内存区域总和大于物理内存限制


你可能感兴趣的:(Java虚拟机)