深度理解JVM-----运行时数据区域

深度理解JVM-----运行时数据区域

以下内容部分转载于: CS-Notes

程序计数器(Program Counter Register)

记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空)。

ps:什么是本地方法?

本地方法是由其他语言(如C、C++ 或其他汇编语言)编写,编译成和处理器相关的代码。本地方法保存在动态连接库中,格式是各个平台专用的,运行中的java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。

学过计算机组成的同学将不难理解,通过计数器寻找到下一条指令

每一个线程都必须存在一个程序计数器,因为一个处理器在同一时间只能处理一个线程(对于单核处理器,或者多核处理器的一个内核)

通过程序计数器,来记录每一个线程所执行到的位置,方便线程直接的切换


Java虚拟机栈(Java Virtual Machine Stacks)

虚拟机栈也是每个线程私有的,它的生命周期与线程相同,虚拟机栈描述的是Java方法执行的内存模型

包括:局部变量表,操作数栈,动态链接,方法出口等信息

每一个方法的从执行到完成,就代表着一个栈的在虚拟机栈中的入栈和出栈的过程

该区域可能抛出以下异常

StackOverflowError :当线程请求的栈深度超过最大值,如递归造成的方法多次调用

OutOfMemoryError :栈进行动态扩展时如果无法申请到足够内存


本地方法栈(Native Method Stack)

本地方法(Native Method): 由其他语言(如C、C++ 或其他汇编语言)编写,编译成和处理器相关的代码。本地方法保存在动态连接库中,格

式是各个平台专用的,运行中的java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。

具体用法和虚拟机栈类似,只不过它服务的对象为本地方法,在Sun公司的HotSpot虚拟机中,就将把本地方法栈和虚拟机栈合二为一

同样会出现 StackOverflowErrorOutOfMemoryError 错误


堆(Heap)

堆是一块被Java所有线程共享的一块内存区域,主要用于存放对象实例和数组

在堆中可以分为

  • 新生代(Young Generation)
  • 老年代(Old Generation)

我们常说的 GC(Garbage Collected Heap) 说的就是整理这一块的内存区域

堆的内存区域不需要连续,可以动态的增加内存,增加失败会抛出 OutOfMemoryError 异常。

可以通过 -Xms 和 -Xmx 这两个虚拟机参数来指定一个程序的堆内存大小,第一个参数设置初始值,第二个参数设置最大值。

java -Xms1M -Xmx2M HackTheJava


方法区(Method Area)

方法区和堆一样,也谁被所有线程共享的内存区域,用于存储已被虚拟机加载的类,常量,静态变量,即时编译器编译后的代码等数据

有一个别名 Non-Heap(非堆),在HotSpot虚拟机上人们习惯称之为 永久代(Permanent Generation)

方法区为JVM的一个规范,定义为存放某些数据,在不同的虚拟机中存在着不同的实现

因为在HotSpot虚拟机上,也存在这方法区的垃圾回收,所以称为永久代。

在永久代中经常会产生对永久代的回收不完全导致内存泄漏爆出OutOfMemoryError的错误

为了更容易管理方法区,在JDK8中,废弃了永久代,改用元空间代替

方法区移至到元空间中,元空间存储于本地内存中,而不是在JVM虚拟机

方法区是一个 JVM 规范,永久代与元空间都是其一种实现方式。

在 JDK 1.8 之后,原来永久代的数据被分到了堆和元空间中。元空间存储类的元信息,静态变量和常量池等放入堆中。


运行时的常量池(Runtime Constant Pool)

运行时的常量池是方法区的一部分,用于存放编译期产生的各种字面量和符号引用

这部分内容将在类加载后进去方法区的运行时常量池存放

除了在编译期生成的常量,还允许动态生成,例如 String 类的 intern()。


直接内存(Direct Memory)

直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域

但是这个区域的内存被频繁使用,任然会造成OutOfMemoryError的异常

JDK 1.4 中新引入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存,然后通过 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。

这样能在一些场景中显著提高性能,因为避免了在堆内存和堆外内存来回拷贝数据。

PS: 直接内存不受Java堆大小的限制,但是既然是内存肯定还是会受本机总内存的影响

转载于:https://juejin.im/post/5ce38fd46fb9a07eb74b1048

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值