java零碎要点001--深入理解JVM_Java的堆内存_栈内存_以及运行时数据区的作用
发布日期:2021-06-29 17:57:49 浏览次数:2 分类:技术文章

本文共 1452 字,大约阅读时间需要 4 分钟。

 
程序计数器:可以看做当前线程运行所执行的字节码的行号指示器,在虚拟机的概念模型中,字节码解释器工作时就是
通过改变这个计数器的值来选取下一条需要执行的字节码指令。由于JVM多线程是通过线程轮流切换并分配处理器执行时间
的方式来实现的,在任何一个确定的时刻,一个处理器只会执行一个线程中的指令。为了使线程切换后能够恢复到正确的
位置,程序计数器必须是线程私有的,独立存储且各线程之间的计数器互不影响。如果线程正在执行的是一个java方法,这个
计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是
Native方法(简单地讲,一个Native Method就是一个
java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。
,这个
计数器的值则为空,此内存区域是
唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
虚拟机栈:虚拟机栈也是线程私有的,它的生命周期和线程的相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被
被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表,操作栈,动态链接,方法出口等信息。每一个方法
被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。虚拟机栈中存放了编译期可知的各种基本
数据类型(boolean、byte、char、short、int、float、long、double)、对象引用类型(
Reference Types
)和 returnAdress类型
returnAddress类型的值指向一条虚拟机指令的操作码。与前面介绍的那些数值类的原生类型不同,returnAddress类型在Java
语言之中并不存在相应的类型,也无法在程序运行期间更改returnAddress类型的值
)。
本地方法栈:本地方法栈与虚拟机栈发挥的作用是非常相似的,虚拟机栈为虚拟机执行Java方法服务,而本地方法栈是为虚拟机使用到的 Native 方法服务,虚拟机对本地方法栈没有强制的规范,具体的虚拟机可以自由实现他。本地方法栈也会抛出 StackOverflowError 和
OutOfMemoryError 异常。
:Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。在java虚拟机规范中有这样的描述:所有的对象实例及数组都要在堆上分配。堆是GC管理的主要区域。Java堆还可以细分为新生代和老年代。当然还有更细的划分方式,这儿不做过多阐述。
方法区:方法区同样是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。Java 虚拟机规范将方法去描述成堆的一个逻辑部分,但是它却有一个别名叫 Non-Heap(非堆),目的应该是与java堆区分开来。Java虚拟机规范对这个区域的限制比较宽松,和Java堆一样,方法去不需要连续的内存,可以选择固定大小,可以扩展,并且一般不对该区域实现垃圾收集。
运行时常量池:运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用,对于常量池,java虚拟机规范没有做任何细节的要求,不同的JVM可以根据要求来自己实现这个内存区域。另外,运行期间也可以将新的常量放进池中。
摘自:深入理解JVM

转载地址:https://credream.blog.csdn.net/article/details/71374569 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:JAVA常用API或编程工具003--实现pdf在线阅读功能之pdf.js
下一篇:数据库零碎要点001_数据库的4大特性(原子性_持久性_隔离性_一致性)_数据库的隔离级别(脏读_幻读_不可重复读)_mysql如何设置隔离级别

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月16日 05时46分33秒