JVM 虚拟机运行时数据区模块与功能

如下为运行时数据区:

有些区域随着虚拟机的进程启动而一直存在,有些区域依赖用户的线程的启动和结束而建立和销毁

运行时数据区内:白色为线程独享,红包为线程共享

1.1 程序计数器

    作用:当前线程所执行的字节码的行号指示器

    出现背景:CPU 高速运转,线程切换回来能继续执行

    线程私有,且不会 OutOfMemoryError

    如果正在执行本地方法,这个计数器为空

1.2 Java 虚拟机栈

    作用:虚拟机栈描述的是 Java 方法执行的线程内存模型,每个方法被执行时候,java 虚拟机都会同步创建一个栈帧用于存储局部变量表,操作数栈,动态连接,方法出口等信息;方法调用的过程,对应着入栈与出栈

    局部变量表:1 存放了编译期可知的基本数据类型(8大数据类型:boolean, byte, char, short, int, long, double, float),对象引用(可能指向对象起始地址的引用指针;可能指向对象的句柄或者其它与此对象相关的位置),returnAddress 类型

        2 局部变量表里面的空间以局部变量槽(Slot)来表示,其中64位长度的 long,double 占用两个槽,其它数据类型一个槽;

        3 局部变量表内存在编译期已经完成分配

 

    线程私有,生命周期与线程相同,如果栈深度大于虚拟机所允许的尝试,会出现 StactOverflowError,动态调整后,还不能满足,会 OOM

 

1.3 本地方法栈

    作用:与虚拟机栈发挥的作用相似,区别在于本地方法栈使用的是本地(Native)方法服务

    会报 StactOverflow, OOM

 

1.4 Java 堆

    作用:此区域唯一目的为存放对象实例,几乎所有的对象都是在这里分配内存,但不绝对,即时编译的进步,逃逸分析,栈上分配,标量替换等优化可以不在堆上分配

    线程共享,不过可以划分出多个线程私有的分配缓冲区TLAB(Thead Local Allocation Buffer),提升对象分配效率

 

    内存不足,会报OOM,通过-Xmx(最大内存), -Xms(初始内存) 设置初始内存与最大内存

    

1.5 方法区

    作用:存储已经被虚拟机加载的类型信息,常量,静态变量,即时编译后的代码缓存

    元空间,永久代的关系:

        jdk8以前,HotSpot称方法区为永久代;jdk8 ,在本地内存中实现了元空间(Mate-space)

        1 JDK7:移出字符串常量池,静态变量到本地内存

        2 JDK8: 把 JDK7 还剩余的内容(主要是类型信息),全部移到元空间

1.6 运行时常量池

    作用:是方法区的一部分;Class 文件中除了类的版本,字段,方法,接口等信息外,还有一个常量池表(Constant Pool Table),用于存放编译期生成的各种字面量与符号引用,这些内存将在类加载后存放到方法区的运行时常量池

    其它重要特性:具备动态性,并非预置入 Class 文件中的常量池的内容才能进入方法区运行时常量池,运行期间也可以将新的常量放入池中,这个特性运用较多的为:比如 String 类的 intern()方法

    属于方法区的部分,会 OOM

 

1.7 直接内存

    作用:经常被使用,比如 jdk1.4 出现的 NIO,NIO 可以通过 Native 函数分配堆外内存,避免了 Java 堆与 Native 堆中来回复制数据

    本地内存分配不会受 Java 堆的限制,但是会受到本地机器内存限制·

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值