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

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方法服务的,本地方法栈是执行本地方法服务的

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值