[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. 斐波那契查找 - 排序算法(顾名思义,就是把没有顺序的…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
