您的位置:首页 > 其它

JVM的内存分区----运行时的数据区域

2016-08-18 21:11 375 查看
对java程序员来说,在虚拟机自动管理机制的帮助下,不需要对每个new操作去写配对的delete/free代码,即java程序员把内存的控制权利交给了java虚拟机。

运行时数据区域






Java虚拟机在执行java程序的时候会把它管理的内存划分为若干个不同的区域,这些区域都有自己的用途和创建以及销毁时间。

(1)程序计数器

1)当前线程所执行的行号指示器。通过改变计数器的值来确定下一条指令,比如循环,分支,跳转,异常处理,线程恢复等都是依赖计数器来完成。

2)Java虚拟机多线程是通过线程轮流切换并分配处理器执行时间的方式实现的。为了线程切换能恢复到正确的位置,每条线程都需要一个独立的程序计数器,所以它是线程私有的。

3)唯一一块Java虚拟机没有规定任何OutofMemoryError的区块

(2)java虚拟机栈

虚拟机栈描述的是java方法执行的内存模型,为执行java方法服务。

1)每个方法执行都会创建一个栈帧,用于存放局部变量表,操作栈,动态链接,方法出口等。每个方法从被调用,直到被执行完。对应着一个栈帧在虚拟机中从入栈到出栈的过程。

2)会有两种异常StackOverFlowError和
OutOfMemoneyError。当线程请求栈深度大于虚拟机所允许的深度就会抛出StackOverFlowError错误;虚拟机栈动态扩展,当扩展无法申请到足够的内存空间时候,抛出OutOfMemoneyError。

3)它是线程私有的,生命周期与线程相同。

(3)本地方法栈

与java虚拟机栈所发挥的作用非常相似,它们之间的区别在于java虚拟机栈执行java方法服务的,本地方法栈是执行本地方法服务的。

(4)java堆

Java堆是java虚拟机所管理的内存中最大的一块,

1)被所有线程共享区域,在虚拟机启动时创建,唯一目的存放对象实例。

2)堆区是gc的主要区域,通常情况下分为两个区块年轻代和年老代。更细一点年轻代又分为Eden区最要放新创建对象,From
survivor 和 To survivor
保存gc后幸存下的对象,默认情况下各自占比
8:1:1。 进一步划分的目的是为了更还的内存回收或者更快的内存分配。

3)会有异常OutOfMemoneyError。

(5)方法区

1)被所有线程共享区域,用于存放已被虚拟机加载的类信息,常量,静态变量等数据。被Java虚拟机描述为堆的一个逻辑部分。习惯是也叫它永久代(仅仅是因为HotSpot虚拟机选择把GC分代收集扩展至方法区)。

2)垃圾回收很少光顾这个区域,不过也是需要回收的,主要针对常量池回收,类型卸载。

3)会有异常OutOfMemoneyError。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息