【jvm】03-写了final就是常量池了么
【jvm】03-写了final就是常量池了么
欢迎关注b站账号/公众号【六边形战士夏宁】,一个要把各项指标拉满的男人。该文章已在github目录收录。
屏幕前的大帅比和大漂亮如果有帮助到你的话请顺手点个赞、加个收藏这对我真的很重要。别下次一定了,都不关注上哪下次一定。
1.jre和jdk的关系
2.运行时数据区域
2.1.程序计数器
它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成
2.2.java虚拟机栈
每个方法被执行的时候,Java虚拟机都 会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息
局部变量表存放了编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、int、 float、long、double)、对象引用
2.3.本地方法栈
本地方法栈是为虚拟机使用到的本地(Native) 方法服务
2.4.java堆
在《Java虚拟机规范》中对Java堆的描述是:“所有 的对象实例以及数组都应当在堆上分配”。Java堆是垃圾收集器管理的内存区域,因此一些资料中它也被称作“GC堆”。
注:由于现代垃圾收集器大部分都是基于分代收集理论设计的,实际上堆内并没有明确的区分。到G1的全代垃圾回收已经有明显废除分代收集的倾向,ZGC则直接摒弃。
2.5.方法区
JDK8以前为永久代实现,以后则为元空间实现,且元空间采用了本地内存不归jvm管理。该区域虽然为非堆但HotSpot虚拟机依然使用了堆的内存管理方式对方法区内的“运行时常量池进行管理”。注意符号引用等会转入常量池不会在元空间,元空间基本只剩下方法的字节码、注解、方法计数器了。顺带一提classloader加载的class对象也会进入堆管理。这里依然要区分堆和非堆的概念,即在概念上这些依然属于方法区,不是堆区。即堆内也是有很多根本不会卸载的东西除非把整个类卸载了。推测在以后的版本是有可能不归堆进行管理的。
2.6.运行时常量池
运行池常量池是方法区内特殊的一部分。编译后的常量池会归入到运行时常量池区域。详情可查看class文件章节的内容,有明确标明class文件的常量池主要有哪些。
2.7.直接内存
它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的 DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。
3.常量池详解
3.1.字面量及符号引用
符号引用包含如下信息:
·被模块导出或者开放的包(Package)
·类和接口的全限定名(Fully Qualified Name)
·字段的名称和描述符(Descriptor)
·方法的名称和描述符
·方法句柄和方法类型(Method Handle、Method Type、Invoke Dynamic)
·动态调用点和动态常量(Dynamically-Computed Call Site、Dynamically-Computed Constant)
3.2.官方给出的存放至常量池的内容
3.3.javap命令实际查看Constant Pool到底存放哪些东西
4.运行时栈桢结构
每一个方法从调用开始至执行结束的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。一个线程中的方法调用链可能会很长。而对于执行引擎来讲,在活动线程中,只有位于栈顶的方 法才是在运行的,只有位于栈顶的栈帧才是生效的,其被称为“当前栈帧”(Current Stack Frame),与这个栈帧所关联的方法被称为“当前方法”(Current Method)
4.1.局部变量表
存放boolean、 byte、char、short、int、float、reference、returnAddress占一个slot
long、double占两个个slot
4.2.操作数栈
后入先出(Last In First Out,LIFO)
当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种 字节码指令往操作数栈中写入和提取内容,也就是出栈和入栈操作。譬如在做算术运算的时候是通过 将运算涉及的操作数栈压入栈顶后调用运算指令来进行的,又譬如在调用其他方法的时候是通过操作数栈来进行方法参数的传递。
4.3.动态连接
每个栈帧都包含一个指向运行时常量池,目的是找到要运行方法的直接引用
4.4.方法返回地址
当一个方法开始执行后,只有两种方式退出这个方法
1)正常调用完成(Normal Method Invocation Completion)
2)异常调用完成(Abrupt Method Invocation Completion)
4.5附加信息
java虚拟机并未规范该部分内容,由各个虚拟机厂商自行实现,通常为性能和调试相关信息
6.GC垃圾回收
因GC垃圾回收版本众多,主要采用的均为分代垃圾回收,主要涉及算法标记-清除,标记-整理,标记-复制三种算法
详情可观看垃圾回收章节
参考资料
《深入理解Java虚拟机》-周志明
【jvm】03-写了final就是常量池了么的更多相关文章
- 【JVM】Java 8 中的常量池、字符串池、包装类对象池
1 - 引言 2 - 常量池 2.1 你真的懂 Java的“字面量”和“常量”吗? 2.2 常量和静态/运行时常量池有什么关系?什么是常量池? 2.3 字节码下的常量池以及常量池的加载机制 2.4 是 ...
- 深入探究JVM之内存结构及字符串常量池
前言 Java作为一种平台无关性的语言,其主要依靠于Java虚拟机--JVM,我们写好的代码会被编译成class文件,再由JVM进行加载.解析.执行,而JVM有统一的规范,所以我们不需要像C++那样需 ...
- jvm堆、栈、String常量池
原文地址:http://blog.csdn.net/tophawk/article/details/78704074 程序计数器:它的生命周期与线程相同,线程私有.较小的内存区域,用以完成分支.循环. ...
- JVM详解之:运行时常量池
目录 简介 class文件中的常量池 运行时常量池 静态常量详解 String常量 数字常量 符号引用详解 String Pool字符串常量池 总结 简介 JVM在运行的时候会对class文件进行加载 ...
- 超过1W字深度剖析JVM常量池(全网最详细最有深度)
面试题:String a = "ab"; String b = "a" + "b"; a == b 是否相等 面试考察点 考察目的: 考察对 ...
- java基础知识回顾之---java String final类 容易混淆的java String常量池内存分析
/** * 栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放 在常量池中). 堆(heap):存 ...
- 从字符串到常量池,一文看懂String类设计
从一道面试题开始 看到这个标题,你肯定以为我又要讲这道面试题了 // 这行代码创建了几个对象? String s3 = new String("1"); 是的,没错,我确实要从这里 ...
- java内存管理--栈、堆和常量池
今天有朋友问java中String[] str = s.split(",")的内存分析,于是开始查资料并测试.首先,发现在java的内存管理中"常量池"是个很奇 ...
- jvm源码解读--03 常量池的解析ConstantPool
先看bt栈 (gdb) bt #0 ConstantPool::allocate (loader_data=0x7fe21802e868, length=87, __the_thread__=0x7f ...
随机推荐
- Linux基础命令---sendmail发送邮件
sendmail sendmail是postfix中的一个发送邮件的代理程序,它负责发送邮件到远程服务器,并且可以接收邮件.sendmail在发送邮件的时候,默认从标砖输入读取内容,以".& ...
- zabbix之模板制作(memcache redis)
#:找一台主机安装redis和memcached(记得安装zabbix-agent) root@ubuntu:~# apt install redis root@ubuntu:~# apt insta ...
- linux 配置本地yum
1.挂载光盘 #挂载光盘 mount /dev/cdrom /mnt/cdrom 2.修改yum.conf, 运行 vi /etc/yum.conf,文件替换成如下内容 [main] cachedir ...
- 最小化安装centos ubuntu基础命令
# yum install vim iotop bc gcc gcc-c++ glibc glibc-devel pcre \ pcre-devel openssl openssl-devel zip ...
- 【Linux】【Services】【Web】Haproxy
1. 概念 1.1. 官方网站 http://www.haproxy.org/ 2. 安装 yum安装 yum -y install haproxy keepalived 配置haproxy日志,修改 ...
- Django REST framework完全入门
Django REST framework 一个强大灵活的Django工具包,提供了便捷的 REST API 开发框架 我们用传统的django也可以实现REST风格的api,但是顶不住Django ...
- RabbitMQ,RocketMQ,Kafka 消息模型对比分析
消息模型 消息队列的演进 消息队列模型 发布订阅模型 RabbitMQ的消息模型 交换器的类型 direct topic fanout headers Kafka的消息模型 RocketMQ的消息模型 ...
- 转置Table.Transpose(Power Query 之 M 语言)
数据源: 任意五行两列 目标: 转置成两行五列 操作过程: [转换]>[转置] M公式: = Table.Transpose( 表 )
- Kafka从入门到放弃(三)—— 详说消费者
之前介绍了Kafka以及生产者,包括它的一些特性和参数,这回写一下消费者. 之前没看得可以点击链接阅读. Kafka从入门到放弃(一) -- 初识Kafka Kafka从入门到放弃(二) -- 详说生 ...
- LuoguB2147 求 f(x,n) 题解
Content 求给定 \(x,n\),求 \(f(x,n)=\sqrt{n+\sqrt{(n-1)+\sqrt{(n-2)+\sqrt{\dots+2+\sqrt{1+x}}}}}\) 的值. So ...