加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

这一次,终于体系的进修了 JVM 内存布局

发布时间:2019-11-05 16:51:49 所属栏目:建站 来源:平头哥
导读:最近在看《 JAVA并发编程实践 》这本书,内里涉及到了 Java 内存模子,通过 Java 内存模子顺理成章的相识到 JVM 内存布局,关于 JVM 内存布局大概大学的教室上先生给我们讲过,大概没有,横竖我对这一块有一点点的相识,可是从来没有体系的进修过,以是这

每一条 Java 假造机线程都有本身私有的 Java 假造机栈,这个 Java 假造机栈跟线程同时建设,以是它跟线程有沟通的生命周期。Java 假造机栈描写的是 Java 要领执行的内存模子:每一个要领在执行的同时城市建设一个栈帧,用于存储局部变量表、操纵数栈、动态链接、要领出口等信息,每一个要领从挪用直至执行完成的进程,就对应着一个栈帧在 Java 假造机栈中的入栈到出栈的进程。

局部变量表存放了编译期可知的各类根基数据范例(boolean、byte、char、short、int、float、long、double)、工具引用(reference 范例,它不等同于工具自己,按照差异的假造机实现,它也许是一个指向工具起始地点的引用指针,也也许指向一个代表工具的句柄可能其他与此工具相干的位置)和 returnAddress 范例(指向了一条字节码指令的地点)。

个中 64 位长度的 long 和 double 范例的数据会占用 2 个局部变量空间(Slot),别的的数据范例只占用 1 个。局部变量表所需的内存空间在编译时代完因素派,当进入一个要领时,这个要领必要在帧平分派多大的局部变量空间是完全确定的,在要领运行时代不会改变局部变量表的巨细。

Java 假造机栈既应承被实现成牢靠的巨细,也应承按照计较动态来扩展和紧缩,假如回收牢靠巨细的话,每一个线程的 Java 假造机栈容量可以在线程建设的时辰独立选定。在 Java 假造机栈中会产生两种非常,这个在假造机类型中有指出:

  • 假如线程哀求分派的栈容量高出 Java 假造机栈应承的最大容量,Java 假造机将会抛出 StackOverflowError 非常;
  • 假如 Java 假造机栈可以动态扩展,而且在实行扩展的时辰无法申请到足够的内存可能在建设新的线程时没有足够的内存去建设对应的 Java 假造机栈,那么假造机将会抛出 OutOfMemoryError 非常。

措施计数器

措施计数器也是线程私有的,它只必要一块较小的内存空间,你可以把它看作当前列程所执行的字节码的行号指示器,在假造机的观念模子里(仅是观念模子,各类假造机也许会通过一些更高效的方法去实现),字节码表明器事变时就是通过改变这个计数器的值来选取下一条必要执行的字节码指令,分支、轮回、跳转、非常处理赏罚、线程规复等基本成果都必要依烂魅这个计数器来完成。

我们知道在多线程的环境下,并不是一条线程一向执行完,而是多个线程轮番切换执行,所觉得了线程切换后可以或许规复到正确的执行位置,我们就必要措施计数器来汇报线程接下来该执行哪条指令。假如线程正在执行的是一个Java 要领,这个计数器记录的是正在执行的假造机字节码指令的地点,假如正在执行的是 Natvie 要领,这个计数器值则为空(Undefined)。

必要出格留意的是,措施计数器是独逐一个在Java假造机类型中没有划定任何 OutOfMemoryError 环境的地区。

当处所法栈(Native Method Stacks)

当处所法栈(Native Method Stacks)与 Java 假造机栈所施展的浸染长短常相似的,其区别不外是 Java 假造机栈为假造机执行 Java 要领(也就是字节码)处事,而当处所法栈则是为假造机行使到的 Native 要领处事。假造机类型中对当处所法栈中的要领行使的说话、行使方法与数据布局并没有逼迫划定,因此详细的假造机可以自由实现它。乃至有的假造机(譬如Sun HotSpot假造机)直接就把当处所法栈和假造机栈合二为一。

与 Java 假造机栈一样,当处所法栈地区也会抛出 StackOverflowError 和 OutOfMemoryError 非常。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读