jvm内存大致可以分为六大块:
堆,虚拟机主要内存,可以形象的说,堆是对象的存储库,几乎所有的对象实例和数组都在此分配内存,当然也死于此,jvm垃圾回收机制(简称GC)主要处理的就是这个地方。它被所有线程共享,没错,这可能造成一些问题,此处留到讨论对象时再说。堆的存储空间在物理上不要求一定连续,实际上它只要让我们看起来是连续的就可以了(虚拟化内存),一般情况下,堆的大小是可以扩展的,当然如果计算机内存满了,导致堆无可申请的话,对象创建就失败了,那么就会抛出outofmemeryError异常。
方法区,顾名思义,它就是用来存储方法的(当然还有别的=。=),它和堆一样被线程共享,负责存储加载的类信息、常量、静态变量、即时编译器编译后的代码等数据(注意,JAVA代码通常是即时编译的,即用到哪里就编译哪里,用的少的就擦掉,用的多的就留下来)。这里同样需要GC的回收和处理,其实通常需要回收的仅仅是常量池而已(至于类信息吗、、、),方法区和堆一样,无可扩展时就会抛出outofmemeryError异常。
本地方法栈,线程私有,这个地方如果不深入剖析的话,很难理解这是干什么用的,因此目前俺只知道它用来存储本地的方法(只有个模糊的感念凭感觉这像是干什么的干什么的、、=。=),区别于JAVA方法,它是对非JAVA语言的一种外部接口。还有它是栈,是栈就可能溢出。
虚拟机栈,每个线程有一个独立的虚拟机栈,互不影响,随线程的出生而出生死亡而死亡,虚拟机栈以帧为单位,每当执行一个方法时,都会在栈顶创建一个栈帧,用于存储局部变量(方法内的)、方法出口等信息,方法的调用和完成的过程,就是栈帧入栈出栈的过程。
程序计数器,这个很重要,每个线程/方法执行到哪了,在哪休眠,在哪恢复,都需要程序计数器记录,由于CPU每个核心同时只能执行一个线程的指令,所以这种记录是非常必要的,因此它线程私有。