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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月16日 05时46分33秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
微信unionid的获取踩到的坑
2019-04-30
nginx配置 php-fpm套接字
2019-04-30
linux 下配置 redis开机自动启动
2019-04-30
css使用百比分来控制图片的显示
2019-04-30
php-cgi.sock failed (13: Permission denied)
2019-04-30
小程序的按需登录的实现代码及思想
2019-04-30
让swoole支持异步redis的编辑安装
2019-04-30
微信支付退款成功回调结果的解密
2019-04-30
解决正式服和测试服两个各自争抢小程序的 access_token的问题
2019-04-30
Delphi10 编写的ActiveX Server没有自动注册的问题
2019-04-30
在CentOS7下安装Angular
2019-04-30
CentOS7下安装rabbitMQ的简单方法
2019-04-30
Centos7安装多个版本nodejs
2019-04-30
Delphi10.2开发兼容JAVA的MD5程序
2019-04-30
MySQL并发获取自增值的测试及处理
2019-04-30
MySQL修改密码的旧办法与新办法
2019-04-30
Docker的Debian容器不支持汉字的问题
2019-04-30
临时或长期修改VIM配色方案
2019-04-30
Debian 10 容器玩转composer
2019-04-30