【JVM】常量池

news2024/7/6 20:40:57

常量池(Runtime Constant Poo)

常量池Java中可以分为三种:字符串常量池(堆)、Class文件常量池、运行时常量池(堆)。

1.字符串常量池(String Pool)

  • 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。
  • 字符串常量池是所有类公用的一块空间,在一个虚拟机中只有一块常量池区域。
  • 字符串常量池存在于堆上。
  • 用来存储一些全局的字符串对象的引用
  • 中生成字符串对象实例,然后将该字符串对象实例的引用值存到字符串常量池中。

2.Class文件常量池(Class Constant Pool)

  • .java文件在通过javac编译后会生成.class文件。
  • Class文件中存放类的版本、字段、方法、接口等描述信息外,还有一项是常量池。
  • 常量池用于存放编译期间生产的各种字面量和符号引用。
  • 每个类都有一个Class文件常量池。

3.运行时常量池(Runtime Constant Pool)

  • JDK1.7及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。
  • 在类加载后将存Class文件常量池的内容加载到运行时常量池。
  • 每个类都有一个运行时常量池。
  • 当常量池无法再申请到内存时会抛出OutMemoryError异常。
    在这里插入图片描述
    4.举例
  • 基本类型的包装类的大部分都实现了常量池技术,即Byte,Short,Integer,Long,Character,Boolean;数值[-128,127]的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。
  • 两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。
Double d3 = 1.2;
Double d4 = 1.2;
System.out.println(d3 == d4);  // false

Integer i1= 40// Java在编译的时候会直接将代码封装成Integer i1=Integer.valueOf(40);,从而使用常量池中的对象。
Integer i2 = new Integer(40); // 这种情况下会创建新的对象,所以尽量避免使用这种方式。
System.out.println(i1 == i2);  // false
String str1 = "abcd";              // 直接使用双引号声明出来的String对象会直接存储在常量池中
String str2 = new String("abcd");  // 堆内存空间创建一个新的对象,str2指向堆对象
String str3 = str2.intern();       // intern()如果运行时常量池中已经包含一个等于此String对象内容的字符串,则返回常量池中该字符串的引用;如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用。
String str4 = str1.intern();

System.out.println(str1 == str2);  // false
System.out.println(str2 == str3);  // false
System.out.println(str1 == str3);  // true
System.out.println(str2 == str3);  // false
System.out.println(str2 == str4);  // false
System.out.println(str3 == str4);  // true
/**
* String str2 = new String("abcd"); 创建了两个对象
* 字符串常量在编译期确定放入常量池,堆上的对象在运行期初始化阶段确定
*/
String str1 = "str";
String str2 = "ing";
String str3 = "str" + "ing"; //常量池中的对象
String str4 = str1 + str2; //在堆上创建的新的对象     
String str5 = "string";    //常量池中的对象
System.out.println(str3 == str4);  // false
System.out.println(str3 == str5);  // true
Integer i1 = 40// Java在编译的时候会直接将代码封装成Integer i1=Integer.valueOf(40);,从而使用常量池中的对象。
Integer i2 = new Integer(40);  // 创建新的对象,所以尽量避免使用这种方式。
Integer i3 = new Integer(40); 
Integer i4 = new Integer(0); 
System.out.println(i2 == i3);       // false
System.out.println(i2 == i3 + i4);  // true,Integer对象不适用 + 操作符,会先进行自动拆箱操作,再进行数值相加。Integer对象无法与数值进行直接比较,所以i2自动拆箱转为int值40,最终这条语句转为40 == 40进行数值比较。
System.out.println(40 == i3 + i4);  // true

参考:
http://tangxman.github.io/2015/07/27/the-difference-of-java-string-pool/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++变量限定

C的变量限定指可以在变量类型的基础上加上特殊的限定条件,主要包括:是不是const,是不是volatile,是左值还是右值,是不是引用,是左值引用还是右值引用,等等。 1. 为什么要研究这个东西 主要是c…

练习之烦人的递归

文章目录1.删除公共字符2.读入一串以?结束的字符串,逆序输出。法一:常规递归法二:投机取巧3.递归将整数输出为字符串4.递归输出1--n的平方和5.递归计算222222...6.递归求最大公约数7.递归输出x的n次方8. 递归计算下列式子的值1.删除公共字符…

从FPGA说起的深度学习(六)-任务并行性

这是新的系列教程,在本教程中,我们将介绍使用 FPGA 实现深度学习的技术,深度学习是近年来人工智能领域的热门话题。在本教程中,旨在加深对深度学习和 FPGA 的理解。用 C/C 编写深度学习推理代码高级综合 (HLS) 将 C/C 代码转换为硬…

还在回想Midjourney的参数,Claude来帮你

本来是想整理一份Midjourne使用的参数表,看来是不用了,Claude很方便的就能帮到我们。 问下Claude: 你知道 Midjourne 的参数吗 Claude 回答如下: 是回答出来了,但是并不是非常的好,我们继续引导他一下: 你…

堆的实际应用(topk问题以及堆排序)

目录 前言: 一:解决topk问题 二:堆排序 【1】第一种方法(很少用) 【2】第二种方法(很实用) 前言: 上一次我们进行了二叉树的初步介绍并实现了堆的基本功能,但堆的作用并不是存储数据,它可以用来解决topk问题(求一组数据较大或…

【C语言】9000字长文操作符详解

简单不先于复杂,而是在复杂之后。 目录 1. 操作符分类 2. 算数操作符 3. 移位操作符 3.1 左移操作符 3.2 右移操作符 4. 位操作符 4.1 按位与 & 4.2 按位或 | 4.3 按位异或 ^ 4.4 一道变态的面试题 4.5 练习 5. 赋值操作符 5.1 复合赋值…

主流接口测试框架对比,究竟哪个更好用

公司计划系统的开展接口自动化测试,需要我这边调研一下主流的接口测试框架给后端测试(主要测试接口)的同事介绍一下每个框架的特定和使用方式。后端同事根据他们接口的特点提出一下需求,看哪个框架更适合我们。 需求 1、接口编写…

项目工作分解工具WBS

WBS工作分解结构(Work Breakdown Structure),是一个描述思路的规划和设计工具,它可以清晰地表示各项目之间相互联系的结构,详细说明为完成项目所必须完成的各项工作,也可以向高层管理者和客户报告项目完成的…

【Redis】高可用架构之Cluster集群和分⽚

高可用架构之Cluster集群和分⽚1. 前言2. Cluster 模式介绍2.1 什么是Cluster模式?2.2 为什么需要Cluster模式?2.2.1 垂直拓展(scale up)和水平拓展(scale out)2.2.2 Redis Cluster 提供的好处2.2.3 Redis …

学术期刊《广西物理》简介及投稿要求

学术期刊《广西物理》简介及投稿要求 《广西物理》(季刊)创刊于1980年,是由广西师范大学;广西物理学会主办的物理杂志。本刊报道与物理有关的基础研究、应用研究以及与此有关的交叉学科研究领域的最新重要研究成果和发展趋势&…

编码与加密基础笔记

文章目录👉1、ASCII 编码👉2、了解Base64👉3、MD5消息摘要算法👉4、对称加密与 AES👉5、非对称加密与 RSA参考书籍《Python 3 反爬虫原理与绕过实战》👉1、ASCII 编码 ASCII编码实际上约定了字符串和二进制…

Python中使用matplotlib时显示中文乱码_(或更改字体)

一、问题描述 在使用matplotlib绘制可视化图表时,图表的中文显示乱码,只能正常显示英文内容,如下图所示: 二、问题分析 一般显示乱码是由于编码问题导致的,而matplotlib 默认使用ASCII 编码,但是当使用pypl…

全语言通用的ASCIL表讲解,这一篇就够了

目录 ASCII码诞生背景 ASCII码特性 可显示字符 大佬们可以看这个 小白们看这个更详细 对控制字符的解释 ASCII码诞生背景 在计算机中,所有的数据在存储和运算时都要使用二进制表示。例如,像a、b、c、d这样的52个字母(包括大写&#xf…

Winnolin 绘制药时曲线图C-T

文章目录前言一、各受试者C-T图1.导入数据2.设置-运行2.查看结果,修改参数二、各制剂C-T图1.导入数据2.设置-运行2.查看结果,修改参数三、平均C-T图1.计算统计量2.设置统计量计算参数(Set Up)3.绘图XY Plot4.查看结果,…

Java多线程基础面试总结(三)

线程的生命周期和状态 Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态: NEW:初始状态,线程被创建出来,但是还没有调用start()方法。RUNABLE:运行中状态,调用了start()…

Java设计模式 11-代理模式

代理模式 一、 代理模式(Proxy) 1、代理模式的基本介绍 代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是: 可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。被代理的对象…

时间序列的平稳性

如何检查时间序列是否平稳,如果它是非平稳的,我们可以怎么处理 当未来的数据与现在相似时,它更容易建模。平稳性描述了时间序列的统计特征不随时间变化的概念。因此一些时间序列预测模型,如自回归模型,依赖于时间序列…

IoC 之 Spring 统一资源加载策略【Spring源码】

《JavaPub源码》 文末是系列文章 IoC 之 Spring 统一资源加载策略 Spring 框架的核心是 IoC(Inversion of Control),它将应用程序的对象依赖关系管理和控制反转到容器中。在 Spring IoC 容器中,组件的创建和配置是通过外部配置…

IDEA 运行启动 pulsar-manager项目

IDEA 运行 pulsar-manager项目(gradle) 1、下载pulsar-manager源码 giithub地址 smn-manager 2、将项目导入IDEA并初始化项目 问题:SSL peer shut down incorrectly 将https改成http之后又会出现 Server returned HTTP response code: …

服务(第四篇)Apache的网页优化

一、网页压缩 ①首先检查是否安装 mod_deflate 模块 ②如果没有安装mod_deflate 模块,重新编译安装 Apache 添加 mod_deflate 模块 yum -y install gcc gcc-c pcre pcre-devel zlib-devel cd /opt/httpd-2.4.29/ ./configure \ --prefix/usr/local/httpd \ --enabl…