JVM的内存分配及各种常量池的区别(静态常量池、运行时常量池、字符串常量池)

JVM内存分配

先了解下JVM中的内存分配,此处以hotspot vm为例(官方jdk采用的vm)

程序计数器

1. 虚拟机栈

2. 本地方法栈

Java

堆内存是各个线程共享的区域

方法区

它用于存储已经被虚拟机加载的类信息、常量、静态变量、即编译器编译后的代码等数据。静态变量、常量在方法区,所有方法,包括静态和非静态的,也在方法区

这里解释一下方法区:

  • 首先方法区不是在堆中,在java8之前是用永久代实现的,永久代Hotspot 虚拟机特有的概念,虽然 Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来

  • java8之后是用元空间实现的,元空间并不在虚拟机中,而是使用本地内存。

只是 JVM 规范中定义的一个概念,用于存储被 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

 

常量池

常量池分为静态常量池运行时常量池

1. 静态常量池

也叫 class文件常量池,主要存放编译期生成的各种字面量(Literal)和符号引用(Symbolic References)

final类型的常量在编译期间就会进行分配。

静态常量池指的是在编译期确定,保存在class文件中的一些数据。

静态常量池是在编译期间生成的,存储在.class文件中。

 

字面量(Literal)和符号引用量,字面量相当于Java语言层面常量的概念,如文本字符串、声明为final的常量值等,符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:

  • 1、类和接口的全限定名;

  • 2、字段的名称和描述符;

  • 3、方法的名称和描述符。

2. 运行时常量池

  • 当类加载到内存中后,JVM就会将class常量池中的内容存放到运行时常量池中;运行时常量池里面存储的主要是编译期间生成的字面量、符号引用等等。

  • 类加载在链接环节的解析过程,会符号引用转换成直接引用(静态链接)。此处得到的直接引用也是放到运行时常量池中的。

  • 运行期间可以动态放入新的常量

运行时常量池内存位置:java8之前都在方法区中,java8之后在元空间

2.1 字符串常量池

字符串常量池,也可以理解成运行时常量池分出来的一部分。类加载到内存的时候,字符串会存到字符串常量池里面。利用池的概念,避免大量频繁创建字符串

  • JDK6时字符串常量池位于运行时常量池,JDK7挪到堆中。

Hotspot8之前,使用持久代实现方法区,由于持久代内存不好估算,很容易到值OOM:Perm Gen异常。而元空间是本地内存,取决于操作系统分配内存。

字符串常量池位置变迁

Jdk1.6及之前: 有永久代, 运行时常量池在永久代,运行时常量池包含字符串常量池

Jdk1.7:有永久代,但已经逐步“去永久代”,字符串常量池从永久代里的运行时常量池分离到堆里

Jdk1.8及之后: 无永久代,运行时常量池在元空间,字符串常量池里依然在堆里

 

 

参考文章

(62条消息) 深入理解java虚拟机(全章节完整)_TJtulong的博客-CSDN博客

(62条消息) Java | JVM | 详细图解,坚持看完,带你真正搞懂Java虚拟机_唐 城的博客-CSDN博客

(62条消息) Java-双亲委派机制_七楼、的博客-CSDN博客

(62条消息) Java-类加载器11127222七楼、的博客-CSDN博客

(62条消息) jvm中的常量池到底在哪里?常量池在哪里yuan_qh的博客-CSDN博客

(62条消息) Java方法区和永久代java永久代和方法区yuan_qh的博客-CSDN博客

这一次,彻底弄懂java中的常量池 - 掘金 (juejin.cn)

(62条消息) JAVA常量池,一篇文章就足够入门了。(含图解)lei'chang'liang'chi河海哥yyds的博客-CSDN博客

(62条消息) Java 常量池详解(一)字符串常量池_new hilbert()的博客-CSDN博客

彻底搞清楚class常量池、运行时常量池、字符串常量池 - Awecoder - 博客园 (cnblogs.com)

 

 

原文链接:https://www.cnblogs.com/dengxiaoyi/p/17318167.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JVM的内存分配及各种常量池的区别(静态常量池、运行时常量池、字符串常量池) - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • 解决Maven静态资源过滤问题

    以下是解决Maven静态资源过滤问题的完整攻略: 1. 什么是Maven静态资源过滤问题 Maven静态资源过滤问题指的是,在使用Maven构建项目时,经常会遇到一些静态资源文件(如CSS、JS等)被Maven自动过滤掉的情况,导致这些文件最终无法被打包进最终的应用程序中去,从而影响了应用的正常运行。 2. 解决Maven静态资源过滤问题的方法 解决Mave…

    Java 2023年5月19日
    00
  • Java中常用数据类型的输入输出详解

    Java中常用数据类型的输入输出详解 在Java中,数据类型的输入输出是非常重要的一个知识点,本文将介绍Java中常用数据类型的输入输出方法,包括基本数据类型和字符串类型。 基本数据类型的输入输出 Java中的基本数据类型包括:byte、short、int、long、float、double和boolean。这些数据类型可以使用Scanner类来进行输入输出…

    Java 2023年5月26日
    00
  • java实现的n*n矩阵求值及求逆矩阵算法示例

    1. 求矩阵的值 求n*n矩阵的值,需要使用行列式的计算方法,具体算法如下: 当矩阵为1*1时,其值即为该矩阵中的元素。 当矩阵为22时,其值为:a[1][1]a[2][2]-a[1][2]*a[2][1]。 当矩阵为n*n时,其值为:按矩阵的第一行、第一列、第二行、第二列等开始,按矩阵的行列式展开来求得。 具体来说,可以使用递归算法来求解矩阵的行列式。递归…

    Java 2023年5月19日
    00
  • Json转化为Java对象的实例详解

    下面我来详细讲解一下“Json转化为Java对象的实例详解”。 什么是Json转化为Java对象 首先,我们需要了解一下什么是Json。Json(JavaScript Object Notation) 是一种轻量级的数据交换格式,常用于前后端数据交互和存储数据。一般来说,我们将Json数据转化为Java对象的过程称之为”Json转化为Java对象”。 Jso…

    Java 2023年5月26日
    00
  • 深入研究spring boot集成kafka之spring-kafka底层原理

    深入研究Spring Boot集成Kafka之Spring Kafka底层原理的攻略如下: 一、关于Spring Kafka Spring Kafka是Spring项目组为了在Spring项目中集成Kafka而研发的一个库,它基于Kafka提供了高度抽象的API, 并与Spring框架完美集成,提供了非常方便的方式用于实现Kafka的生产和消费。 二、Spr…

    Java 2023年6月2日
    00
  • JSP 中response.setContentType()的作用及参数

    在 JSP 程序中,response.setContentType() 方法可以设置响应的MIME类型,MIME 类型全称是 Multipurpose Internet Mail Extensions,意为多用途互联网邮件扩展类型,它是一种标准,用来表示文档在网络传输中的格式,例如 HTML 页面可以使用 text/html,JPG 图片可以使用 image…

    Java 2023年6月15日
    00
  • Java8 Stream 流常用方法合集

    Java8 Stream 流常用方法合集 Java 8 引入了一种新的抽象数据类型 Stream,它让数据的操作变得更加简单高效。Stream 可以是一组数据的集合、数组等等,它支持多方面的操作,比如过滤、映射、筛选、分组、去重、排序等等。下面将介绍 Java8 Stream 常用的方法。 创建流 从集合创建流:可以将一个集合转换为流,并对流中的元素进行操作…

    Java 2023年5月26日
    00
  • 用JSP编写文件上传

    以下是使用JSP编写文件上传的完整攻略。 1. HTML表单 首先,我们需要在HTML文件中创建一个表单控件,让用户选择需要上传的文件并提交表单。代码如下: <form action="upload.jsp" method="post" enctype="multipart/form-data&quot…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部