【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就是常量池了么的更多相关文章

  1. 【JVM】Java 8 中的常量池、字符串池、包装类对象池

    1 - 引言 2 - 常量池 2.1 你真的懂 Java的“字面量”和“常量”吗? 2.2 常量和静态/运行时常量池有什么关系?什么是常量池? 2.3 字节码下的常量池以及常量池的加载机制 2.4 是 ...

  2. 深入探究JVM之内存结构及字符串常量池

    前言 Java作为一种平台无关性的语言,其主要依靠于Java虚拟机--JVM,我们写好的代码会被编译成class文件,再由JVM进行加载.解析.执行,而JVM有统一的规范,所以我们不需要像C++那样需 ...

  3. jvm堆、栈、String常量池

    原文地址:http://blog.csdn.net/tophawk/article/details/78704074 程序计数器:它的生命周期与线程相同,线程私有.较小的内存区域,用以完成分支.循环. ...

  4. JVM详解之:运行时常量池

    目录 简介 class文件中的常量池 运行时常量池 静态常量详解 String常量 数字常量 符号引用详解 String Pool字符串常量池 总结 简介 JVM在运行的时候会对class文件进行加载 ...

  5. 超过1W字深度剖析JVM常量池(全网最详细最有深度)

    面试题:String a = "ab"; String b = "a" + "b"; a == b 是否相等 面试考察点 考察目的: 考察对 ...

  6. java基础知识回顾之---java String final类 容易混淆的java String常量池内存分析

    /** *   栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放  在常量池中). 堆(heap):存 ...

  7. 从字符串到常量池,一文看懂String类设计

    从一道面试题开始 看到这个标题,你肯定以为我又要讲这道面试题了 // 这行代码创建了几个对象? String s3 = new String("1"); 是的,没错,我确实要从这里 ...

  8. java内存管理--栈、堆和常量池

    今天有朋友问java中String[] str = s.split(",")的内存分析,于是开始查资料并测试.首先,发现在java的内存管理中"常量池"是个很奇 ...

  9. jvm源码解读--03 常量池的解析ConstantPool

    先看bt栈 (gdb) bt #0 ConstantPool::allocate (loader_data=0x7fe21802e868, length=87, __the_thread__=0x7f ...

随机推荐

  1. 数组相关API,reduce

    reduce() 方法接受一个数组作为输入值并返回一个值.这点挺有趣的.reduce 接受一个回调函数,回调函数参数包括一个累计器(数组每一段的累加值,它会像雪球一样增长),当前值,和索引.reduc ...

  2. ajaxSubmit返回JSON格式

    开发时遇到根据不同情况返回错误提示信息的需求,用到了ajax中返回json格式数据的. 前台请求代码: <script type="text/javascript">  ...

  3. [学习总结]9、Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)

    这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影. 可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚 ...

  4. Linux学习 - 目录表

    目录名 作用 权限 说明 /bin/ 存放系统命令的目录 所有用户 存放在/bin/下的命令单用户模式下也可以执行 /sbin/ 保存和系统环境设置相关的命令 root                 ...

  5. When does compiler create default and copy constructors in C++?

    In C++, compiler creates a default constructor if we don't define our own constructor (See this). Co ...

  6. idea如何在git上将分支代码合并到主干

    1.首先将idea中的代码分支切换到master分支,可以看到我们在dev上提交的代码 在master上是没有的 2.如图所示,在remote branch 上选择分支,点击后面的三角图标,展开之后选 ...

  7. jstl中的foreach标签

    <%@ page import="java.util.ArrayList" %><%@ page import="java.util.List" ...

  8. 莫烦python教程学习笔记——线性回归模型的属性

    #调用查看线性回归的几个属性 # Youtube video tutorial: https://www.youtube.com/channel/UCdyjiB5H8Pu7aDTNVXTTpcg # ...

  9. 【Linux】【专项突破】Linux重定向与管道

    [专项突破]Linux重定向与管道 This article is written by Xrilang(Chinese Name:萌狼蓝天) If you want find me ,You can ...

  10. ANTLR 环境准备

    基本环境: JDK8 Maven IntelliJ IDEA IntelliJ IDEA中安装ANTLR v4插件 在IntelliJ IDEA插件仓库中搜索ANTLR v4插件并安装,如下图: 看个 ...