JVM内存分布

java虚拟机内存分布

给人看病或者调养,需要了解器官和运行状态。jvm也是

jvm我们大家都知道就是自带的HotSpot VM
其实还有一些别的IBM J9 JRockit Graal VM Substrate VM
这些都是遵循《Java虚拟机规范》开发出来的

jvm里的内存是怎么分配的?

  1. 程序计数区(线程私有)
这块儿区域比较小,并且不会抛出异常。
每一个线程都会在这个区域里开辟空间。用来记录线程里   下一个需要执行的指令的代号
  1. Java虚拟机栈(线程私有)
虚拟机栈 本质是一个栈的数据结构  他的生命周期和线程一样。线程创建就开辟,线程销毁就销毁。

因为这里边存的是方法执行时的     局部变量、操作数栈、动态连接、方法出口等信息
  1. 本地方法栈
本地方法栈本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,
其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,
而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。
  1. JAVA堆
Java堆(Java Heap)是虚拟机所管理的内存中最大的一块

Java堆是被所有线程共享的一块内存区域,在虚拟机启动时就创建

存放了     对象的实例
  1. JAVA方法区
方法区方法区(Method Area)与Java堆一样
是各个线程共享的内存区域

存放了     类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据
  1. 运行时常量池
运行时常量池运行时常量池(Runtime Constant Pool)是方法区的一部分

Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table)
用于存放编译期生成的各种字面量与符号引用。
这部分内容将在类加载后存放到方法区的运行时常量池中
  1. 直接内存
直接内存直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分, 也不是《Java虚拟机规范》中定义的内存区域。
但是这部分内存也被频繁地使用

通过一个存储在Java堆 里面的 DirectByteBuffer对象作为这块内存的引用进行操作 
避免了在Java堆和Native堆中来回复制数据

显然,本机直接内存的分配不会受到Java堆大小的限制,
但是,既然是内存,则肯定还是会受到本机总内存(包括物理内存、SWAP分区或者分页文件)大小以及处理器寻址空间的限制,
一般服务器管理员配置虚拟机参数时,会根据实际内存去设置-Xmx等参数信息,
但经常忽略掉直接内存,
使得各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制),
从而导致动态扩展时出现OutOfMemoryError异常
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰明子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值