【JVM】常量池

常量池(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/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 23 实用工具(二)绑定工具

C 23 实用工具(二)绑定工具 Adaptors for Functions std::bind、std::bind_front、std::bind_back和std::function这四个函数非常适合一起使用。 其中,std::bind、std::bind_front和std::bind_back可以让您即时创建新的函数对象&#xff0c…

protobuf编码格式解析

示例 假如定义一个如下的protobuf类型 message Person {required string user_name 1;optional int64 favorite_number 2;repeated string interests 3; }将其赋值为: user_name : "Martin" favorite_number : 1337 interests:"daydrea…

(PCB系列三)AD六层板布线经验累积

目录 1、布局: 2、创建电源类PWR 3、高速部分可以加屏蔽罩, 4、EMMC和NANDFLASH采取兼容放置(创建联合) 5、HDMI设计 6、就近原则摆放 7、AV端口 8、模拟信号(1字型或L型走线) 9、WIFI模块 10、局…

【精华】表格结构识别模型研究进展

表格结构识别模型研究进展 合合信息:表格识别与内容提炼技术理解及研发趋势 OCR之表格结构识别综述 表格识别技术综述 用于表检测和结构识别的深度学习:综述 (1)PP-Structure 速度提升11倍,一键PDF转Word PP-St…

【软考备战·希赛网每日一练】2023年4月12日

文章目录 一、今日成绩二、错题总结第一题 三、知识查缺 题目及解析来源:2023年04月12日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析: 依据题目画出PERT图如下: 关键路径长度(从起点到终点的路径中最长的一条&…

递归算法_字符串反转_20230412

递归算法-字符串反转 前言 递归算法对解决重复的子问题非常有效,字符串反转也可以用递归算法加以解决,递归算法设计的关键是建立子问题和原问题之间的相关性,同时需要确立递归退出的条件;如果递归退出的条件无法确定&#xff0c…

说过的话就一定要办到 - redo日志

一、什么是redo日志? 如果我们只在内存的 Buffer Pool 中修改了页面,假设在事务提交后突然发生了某个故障,导致内存中的数据都失效了,那么这个已经提交了的事务对数据库中所做的更改也就跟着丢失了,这会导致事务会失去…

4.基于多目标粒子群算法冷热电联供综合能源系统运行优化

4.基于多目标粒子群算法冷热电联供综合能源系统运行优化《文章复现》 相关资源代码:基于多目标粒子群算法冷热电联供综合能源系统运行优化 基于多目标算法的冷热电联供型综合能源系统运行优化 考虑用户舒适度的冷热电多能互补综合能源系统优化调度 仿真平台:matl…

Segment Anything论文翻译,SAM模型,SAM论文,SAM论文翻译;一个用于图像分割的新任务、模型和数据集;SA-1B数据集

【论文翻译】- Segment Anything / Model / SAM论文 论文链接: https://arxiv.org/pdf/2304.02643.pdfhttps://ai.facebook.com/research/publications/segment-anything/ 代码连接:https://github.com/facebookresearch/segment-anything 论文翻译&…

性能测试,python 内存分析工具 -memray

Memray是一个由彭博社开发的、开源内存剖析器;开源一个多月,已经收获了超8.4k的star,是名副其实的明星项目。今天我们就给大家来推荐这款python内存分析神器。 Memray可以跟踪python代码、本机扩展模块和python解释器本身中内存分配&#xf…

VR全景展示,VR全景平台,助理全景展示新模式

引言: VR全景展示是一种新型的展示方式,它利用虚拟现实技术和全景拍摄技术,使参观者可以身临其境地进入虚拟展览空间。这种展示方式不仅能够提供更加沉浸式的参观体验,还可以解决传统展览所面临的时间和地域限制等问题。 VR全景展…

测试工具之JMH详解

文章目录 1 JMH1.1 引言1.2 简介1.3 DEMO演示1.3.1 测试项目构建1.3.2 编写性能测试1.3.3 执行测试1.3.4 报告结果 1.4 注解介绍1.4.1 BenchmarkMode1.4.2 Warmup1.4.3 Measurement1.4.4 Threads1.4.5 Fork1.4.6 OutputTimeUnit1.4.7 Benchmark1.4.8 Param1.4.9 Setup1.4.10 Te…

leetcode 812. 最大三角形面积

题目 给你一个由 X-Y 平面上的点组成的数组 points ,其中 points[i] [xi, yi] 。从其中取任意三个不同的点组成三角形,返回能组成的最大三角形的面积。与真实值误差在 10-5 内的答案将会视为正确答案。 示例 1: 输入:points [[…

ActiveReportsJS 4.0 FIX ActiveReportsJS 4.0 Crack

JavaScript 报告工具是一组用于数据整合和可视化的 Web 组件。ActiveReportsJS 是前端开发人员用来在 Web 应用程序中嵌入报告的解决方案。报表设计器和查看器组件、强大的数据可视化器和丰富的 API 等主要功能使 ActiveReportsJS 成为行业领导者。 JavaScript 报告引擎 利用强…

Spark SQL join操作详解

一、 数据准备 本文主要介绍 Spark SQL 的多表连接,需要预先准备测试数据。分别创建员工和部门的 Datafame,并注册为临时视图,代码如下: val spark SparkSession.builder().appName("aggregations").master("lo…

Python进阶内容--迭代器和生成器

什么是迭代器 在 Python 中,迭代器(Iterator)是一个访问集合元素的对象,它能够实现遍历集合的所有元素,而无需了解集合底层结构和细节。Python 中所有可迭代的对象(如 列表、元组、字符串、字典、集合等&a…

leetcodeTmp

文章目录 39. 组合总和33. 搜索旋转排序数组153. 寻找旋转排序数组中的最小值49. 字母异位词分组53. 最大子数组和55. 跳跃游戏56. 合并区间62. 不同路径 39. 组合总和 39. 组合总和 DFS排列&#xff1a;每个元素可选0次&#xff0c;1次以及多次 public List<List<Int…

元宇宙:虚拟仿真技术的全面提升

在当今数字化的世界中&#xff0c;我们经常听到虚拟现实、增强现实、混合现实等技术的名词&#xff0c;这些技术的应用越来越成熟。其中&#xff0c;虚拟仿真技术是一种通过计算机技术来模拟实际场景和对象的过程&#xff0c;它为我们提供了更多的可能性。而最近备受瞩目的元宇…

加密的本质:数学的不对称性

文章目录 引言I 预备知识1.1 加密和授权1.2 非对称的特性II 椭圆曲线加密的方法2.1 椭圆曲线2.2 椭圆曲线的性质引言 不对称有时却自有其妙处与美感,比如黄金分割就是不对称的。 可以通过加密和授权,兼顾保护信息不外泄,而且某些得到授权的人还能使用信息。 I 预备知识 …

亚马逊云科技为全球的可持续发展进程做出贡献

可持续发展是一个涉及经济、环境和社会三个方面的复杂问题。经济发展必须在保护环境和社会公正的前提下进行&#xff0c;这样才能实现真正的可持续发展。为了实现这一目标&#xff0c;人们需要借助技术手段&#xff0c;更好地理解和解决环境和社会问题。 亚马逊云科技是全球领…