您的位置:首页 > 编程语言 > Java开发

JVM运行时区域由哪几部分组成?分别介绍一下

2018-03-30 16:20 253 查看
Java虚拟机的运行时区域构成图如下所示:



线程共享区域:Java堆:(1)Java堆是java虚拟机所管理的内存中最大的一块;(2)被所有线程共享区域,在虚拟机启动时创建,唯一目的存放对象实例;(3)堆区是gc的主要区域,通常情况下分为两个区块年轻代和年老代。更细一点年轻代又分为Eden区最要放新创建对象,From survivor 和 To survivor 保存gc后幸存下的对象,默认情况下各自占比 8:1:1。 进一步划分的目的是为了更还的内存回收或者更快的内存分配;(4)会有异常OutOfMemoneyError;方法区:(1)被所有线程共享区域,用于存放已被虚拟机加载的类信息,常量,静态变量等数据。被Java虚拟机描述为堆的一个逻辑部分。习惯是也叫它永久代(仅仅是因为HotSpot虚拟机选择把GC分代收集扩展至方法区);(2)垃圾回收很少光顾这个区域,不过也是需要回收的,主要针对常量池回收,类型卸载。(3)会有异常OutOfMemoneyError;线程私有区域:程序计数器:(1)当前线程所执行的字节码指令的行号指示器,如分支、跳转、循环、异常处理、线程恢复都依赖程序计数器实现;(2)Java多线程是通过线程轮流切换并分配CPU时间片来执行的,为了线程切换后能恢复到正确的位置,所以每个线程都有一个单独的程序计数器,所以程序计数器是私有的;(3)Jvm没有规定OutOfMemory的区块;Java虚拟机栈:(1)为执行Java方法服务‘(2)当线程创建的时候,为线程分配一块内存区域,在线程执行的过程中,每个方法的执行都会创建一个栈帧,用于存放局部变量表、操作栈、动态链接,方法出口等。每个方法从被调用,直到被执行完。对应着一个栈帧在虚拟机中从入栈到出栈的过程;(3)会有两种异常StackOverFlowError和 OutOfMemoneyError。当线程请求栈深度大于虚拟机所允许的深度就会抛出StackOverFlowError错误;虚拟机栈动态扩展,当扩展无法申请到足够的内存空间时候,抛出OutOfMemoneyError;(4)它是线程私有的,生命周期与线程相同;本地方法栈:(1)与java虚拟机栈所发挥的作用非常相似,它们之间的区别在于java虚拟机栈执行java方法服务的,本地方法栈是执行本地方法服务的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java虚拟机