[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)
文章目录
- 1. JVM内存模型
- 2. 常量池中有什么类型?
- 3. 常量池中真正存储的内容是什么
- 4. 判断一个字符串(引用)是否在常量池中
- 5. BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗?
- 6. 获取堆内存使用情况、非堆内存使用情况
1. JVM内存模型
2. 常量池中有什么类型?
常量池中主要包含以下几种类型的常量:
-
字面量
-
文本字符串:程序中直接书写的字符串,如
"hello"
。 -
基本数据类型常量:整数、浮点数、字符等,如
123
、3.14
、'a'
。 -
被声明为
final
的常量值:在编译时已知的常量表达式结果。 -
符号引用
-
类和接口的全限定名:如
java.lang.String
。 -
字段的名称和描述符:包括字段的类型信息,如
int age
中的age
和int
。 -
方法的名称和描述符:包括方法的参数类型和返回类型,如
public String getName()
中的getName
和(Ljava/lang/String;)V
。 -
其他类型
-
方法句柄和动态调用点:用于支持Java 7引入的invokedynamic指令,实现动态语言特性。
常量池是JVM的重要组成部分,它存储了程序运行所需的各种常量信息,有助于优化内存使用和提升程序性能。
3. 常量池中真正存储的内容是什么
以字符串举例:
- 字符串常量池存储的是字符串对象的引用,而不是对象本身,字符串本身还是在堆中。
- 当使用字面量形式创建字符串(如
String s = "hello";
)时,该字符串会被放入常量池,实际存储的是对堆中字符串对象的引用。 - 可以认为字符串常量池的作用就是使堆中的字符串被重复引用,而不用在堆中创建新的字符串对象
4. 判断一个字符串(引用)是否在常量池中
String str = "abc"; // 这种写法字符串在常量池中
String str1 = new String("abc"); // 这种写法字符串在堆内存中
System.out.println(str == str1); // false,可以判断两个对象是否是相同的内存地址,都在堆中或都在常量池(引用)中// String的intern()方法会返回字符串在常量池中的引用。如果常量池中已存在该字符串,则直接返回;
// 否则,将该字符串加入常量池并返回引用。
String str2 = str1.intern();
System.out.println(str == str2); // true
System.out.println(str == str1); // false// 返回常量池中的引用,虽然将str1加入常量池,但str2和str1不是同一个对象,
// 因为"abc"已经存在于常量池中,所以str1.intern()返回的其实是str的引用地址
System.out.println(str2 == str1); // false// 创建新对象
String str3 = new String("abc"); // 堆内存
System.out.println(str == str3); // false,证明str3不在常量池中,而在堆中
System.out.println(str1 == str3); // false,证明str3是堆中不同于str1的另一个对象
5. BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗?
Person person = new Person(); // 堆内存
person.setName("xiaohua");
Person person1 = new Person();
BeanUtils.copyProperties(person, person1);
System.out.println(person == person1); // false,person和person1不是同一个对象
System.out.println("person.name == person1.name: " + (person.getName() == person1.getName())); // person.name == person1.name: true
person1.setName("xiaohuahua");
System.out.println("person: " + JSONObject.toJSONString(person)); // person: {"name":"xiaohua"}
System.out.println("person1: " + JSONObject.toJSONString(person1)); // person1: {"name":"xiaohuahua"}
System.out.println("person.name == person1.name: " + (person.getName() == person1.getName())); // person.name == person1.name: false
String str4 = "xiaohua";
System.out.println(str4 == person.getName()); // true,证明person中name的值是常量池中的引用
String str5 = "xiaohuahua";
System.out.println(str5 == person1.getName()); // true,证明person1中name的值是常量池中的引用
总结:
BeanUtils.copyProperties(source, target),source和target的属性name的值是在常量池中,
所以target虽然是一个新对象,但里面属性name其实引用相同,常量池中存的是堆中对象的地址;
当target重新给name赋值时,值是新的也是属于常量池。
6. 获取堆内存使用情况、非堆内存使用情况
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
// getHeapMemoryUsage() 方法返回一个 MemoryUsage 对象,表示当前 JVM 堆内存的使用情况。
// MemoryUsage 包含以下属性:
// init: 初始分配的内存量(以字节为单位)。
// used: 当前已使用的内存量(以字节为单位)。
// committed: 已提交给 JVM 的内存量(以字节为单位),这部分内存可以立即使用。
// max: 最大可用内存量(以字节为单位),如果未设置最大值,则为 -1。
MemoryUsage heapUsage = memoryMXBean.getHeapMemoryUsage();
// heapUsage:init = 117440512(114688K) used = 18740896(18301K) committed = 112721920(110080K) max = 1648361472(1609728K)
System.out.println("heapUsage:" + heapUsage);// getNonHeapMemoryUsage() 方法返回一个 MemoryUsage 对象,表示当前 JVM 非堆内存的使用情况。
MemoryUsage nonHeapUsage = memoryMXBean.getNonHeapMemoryUsage();
// nonHeapUsage:init = 2555904(2496K) used = 16119416(15741K) committed = 16842752(16448K) max = -1(-1K)
System.out.println("nonHeapUsage:" + nonHeapUsage);
相关文章:

[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)
文章目录 1. JVM内存模型2. 常量池中有什么类型?3. 常量池中真正存储的内容是什么4. 判断一个字符串(引用)是否在常量池中5. BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗?6. 获取堆内存使用情况、非堆内存使用情况 1. JVM内…...
`maturin`是什么:matu rus in python
maturin是什么 maturin 是一个用于构建和发布 Rust 编写的 Python 绑定库的工具。它简化了将 Rust 代码集成到 Python 项目中的过程,支持创建不同类型的 Python 包,如纯 Python 包、包含 **Rust (系统编程语言)**扩展模块的包等。以下为你详细介绍 maturin 的相关信息并举例…...

spring boot整合flyway实现数据的动态维护
1、简单介绍一下flyway Flyway 是一款开源的数据库版本控制工具,主要用于管理数据库结构的变更(如创建表、修改字段、插入数据等)。它通过跟踪和执行版本化的迁移脚本,帮助团队实现数据库变更的自动化。接下来简单介绍一下flyway…...

unity中使用spine详解
一.Spine概述 Spine 是一款针对游戏开发的 2D 骨骼动画编辑工具。 Spine 旨在提供更高效和简洁 的工作流程,以创建游戏所需的动画。 Spine原理:将一个模型,根据动画的需求分成一些骨骼,一个骨骼对应一张贴图,控制骨骼…...

14. LangChain项目实战1——基于公司制度RAG回答机器人
教学视频: 12. 基于Gradio搭建基于公司制度RAG_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11VXRYTErZ/ 环境配置: python版本:3.10.8 服务器:Ubuntu 依赖包requirements.txt文件内容: aiofiles23.2.1 …...

利用STM32TIM自制延迟函数实验
一、实验目的 掌握STM32定时器(TIM)的工作原理及配置方法学习使用HAL库实现微秒级/毫秒级延时函数理解定时器中断服务程序的编写规范 二、实验原理 定时器基础: STM32定时器包含向上计数器、向下计数器、中心对齐模式通过预分频器&#x…...

创建一个MCP服务器,并在Cline中使用,增强自定义功能。
MCP介绍 MCP 是一个开放协议,它标准化了应用程序如何向LLMs提供上下文。可以将 MCP 视为 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种标准化的方法来将您的设备连接到各种外围设备和配件一样,MCP 提供了一种标准化的方法来将 AI 模型连接到不同的…...
Android Activity栈关系解析
在 Android 系统中,这些类共同构成了 Activity 任务栈管理的核心架构。它们的关系可以类比为一栋大楼的管理体系,每个类负责不同层级的任务。以下是它们的详细解释和实际场景示例: 1. ActivityRecord(活动记录) 是什么…...
java使用word模板填充内容,再生成pdf
1.word模板填充内容 使用EasyPoi写入Word文档。 import cn.afterturn.easypoi.word.WordExportUtil; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument;import java.io.File; import java…...

回归实战详细代码+解析:预测新冠感染人数
回归实战:预测新冠感染人数 先回顾下回归是个啥玩意 首先需要一组训练集,说人话就是通过一系列x[x1,x2…xn]通过神秘计算得到y的过程,当然人和机器现在都不知道什么计算是什么,这是一个黑箱。 黑箱比喻:把模型想象成自…...

AI人工智能机器学习之聚类分析
1、概要 本篇学习AI人工智能机器学习之聚类分析,以KMeans、AgglomerativeClustering、DBSCAN为例,从代码层面讲述机器学习中的聚类分析。 2、聚类分析 - 简介 聚类分析是一种无监督学习的方法,用于将数据集中的样本划分为不同的组ÿ…...

(下:补充——五个模型的理论基础)深度学习——图像分类篇章
目录 1.1 卷积神经网络基础 3.1 AlexNet网络结构详解与花分类数据集下载 4.1 VGG网络详解及感受野的计算 5.1 GoogLeNet网络详解 6.1 ResNet网络结构,BN以及迁移学习详解 总结(可以直接看总结) 1.1 卷积神经网络基础 视频讲解…...
使用Python自动生成图文并茂的网页分析报告
在数据分析中,不管是市场研究还是科学分析,经常需要使用Python进行数据分析并生成图表报告。一般使用Python生成和展示图表时都是使用matplotlib 库生成静态图片文件,这种方式不便之处是不方便跟动态文字段落结合在一起,也不方便分…...

uniapp-原生android插件开发摘要
uni-app在App侧的原生扩展插件,支持使用java、object-c等原生语言编写,从HBuilderX 3.6起,新增支持了使用uts来开发原生插件。 基础项目 UniPlugin-Hello-AS工程请在App离线SDK中查找 基础项目(App离线SDK)已经配置好了自定义插件所需要的…...

GIT工具学习【1】:基本操作
目录 0.本地代码分区1.配置自己的个人信息(设置一次即可)2.新建仓库3.提交代码到暂存区(加入购物车)4.从暂存区撤回(不会改变工作区文件)5.恢复指定版本(会改变工作区文件)5.1&#…...
《国密算法开发实战:从合规落地到性能优化》
前言 随着信息技术的飞速发展,信息安全已成为全球关注的焦点。在数字化时代,数据的保密性、完整性和可用性直接关系到国家、企业和个人的利益。为了保障信息安全,密码技术作为核心支撑,发挥着至关重要的作用。国密算法,即国家密码算法,是我国自主设计和推广的一系列密码…...

【语法】C++中string类中的两个问题及解答
贴主在学习string类时遇到过两个困扰我的问题,今天拿出来给大家分享一下我是如何解决的 一、扩容时capacity的增长问题 在string的capacity()接口中,调用的是这个string对象的容量(可以存多少个有效字符),而size()是调用的string对象现在有…...
LeetCode-154. 寻找旋转排序数组中的最小值 II
1、题目描述: 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,…...
2.数据结构:1.Tire 字符串统计
1.Tire 字符串统计 #include<algorithm> #include<cstring> #include<iostream>using namespace std;const int N100010; int son[N][26];//至多 N 层,每一层至多 26 个节点(字母) int cnt[N];//字符串至多 N 个ÿ…...
C语言复习4:有关数组的基础常见算法
# 数组的常见算法 - 查找算法 1. 基本查找/顺序查找 2. 二分查找/折半查找 3. 插值查找 4. 分块查找 5. 哈希查找 6. 树表查找 7. 斐波那契查找 - 排序算法(顾名思义,就是把没有顺序的…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...