[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)

文章目录

  • 1. JVM内存模型
  • 2. 常量池中有什么类型?
  • 3. 常量池中真正存储的内容是什么
  • 4. 判断一个字符串(引用)是否在常量池中
  • 5. BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗?
  • 6. 获取堆内存使用情况、非堆内存使用情况

1. JVM内存模型

在这里插入图片描述

2. 常量池中有什么类型?

常量池中主要包含以下几种类型的常量:

  • 字面量

  • 文本字符串:程序中直接书写的字符串,如"hello"

  • 基本数据类型常量:整数、浮点数、字符等,如1233.14'a'

  • 被声明为final的常量值:在编译时已知的常量表达式结果。

  • 符号引用

  • 类和接口的全限定名:如java.lang.String

  • 字段的名称和描述符:包括字段的类型信息,如int age中的ageint

  • 方法的名称和描述符:包括方法的参数类型和返回类型,如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); 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

塔能科技:工厂智慧照明,从底层科技实现照明系统的智能化控制

在全球节能减碳和智慧生活需求激增的背景下,基于“用软件定义硬件,让物联运维更简捷更节能”的产品理念,塔能科技的智慧照明一体化方案如新星般崛起,引领照明行业新方向。现在,我们来深入探究其背后的创新技术。该方案…

RabbitMq-消息确认机制-消息队列可靠投递

RabbitMq-消息确认机制-消息队列可靠投递 发送端确认 ConfirmCallback 在spring中开启ConfirmCallback, springboot rabbitmq属性配置spring.rabbitmq.publisher-confirm和spring.rabbitmq.publisher-confirm-type详解_弃用的配置属性 spring.rabbitmq.publisher-…

水滴tabbar canvas实现思路

废话不多说之间看效果图,只要解决了这个效果水滴tabbar就能做出来了 源码地址 一、核心实现步骤分解 布局结构搭建 使用 作为绘制容器 设置 width=600, height=200 基础尺寸 通过 JS 动态计算实际尺寸(适配高清屏) function initCanvas() {// 获取设备像素比(解决 Re…

散户如何实现自动化交易下单——篇1:体系介绍与获取同花顺资金账户和持仓信息

一、为什么要实现自动化交易 在瞬息万变的金融市场中,越来越多的散户投资者开始尝试构建自己的交易策略:有人通过技术指标捕捉趋势突破,有人利用基本面分析挖掘低估标的,还有人设计出复杂的网格交易或均值回归模型。然而&a…

32位,算Cache地址

32位,算Cache地址

cursor 弹出在签出前,请清理仓库工作树 窗口

问题出现的背景:是因为我有两台电脑开发,提交后,另一个电脑的代码是旧的,这个时候我想拉取最新的代码,就会出现如下弹窗,因为这个代码暂存区有记录或者工作区有代码的修改,所以有冲突&#xff0…

基于Ant Design Vue 引入 Flowable 【workflow-bpmn-modeler-antdv】流程设计器组件

安装Ant Design Vue npm i --save ant-design-vue1.7.2安装less相关依赖 npm install less3.9.0 less-loader5.0.0 --save-dev安装设计器 npm i workflow-bpmn-modeler-antdv在src目录下创建flowable文件夹&#xff0c;并创建Demo.vue文件 <template><div style&q…

Linux云计算SRE-第十五周

1.总结Dockerfile的指令和Docker的网络模式 一、Dockerfile 核心指令详解 1、基础构建指令 指令 功能描述 关键特性 FROM 指定基础镜像&#xff08;必须为首条指令&#xff09; - 支持多阶段构建&#xff1a;FROM node AS builder - scratch 表示空镜像 RUN 在镜像构建…

Linux:进程概念

目录 1 冯诺依曼体系 2 操作系统(Operator System) 3 如何理解管理 3.1计算机管理硬件 3.2 管理逻辑图 3.3 怎样管理 4 什么是进程&#xff1f; 5 查看进程 5.1 ps ajx显示所有进程信息 5.2 /proc(内存文件系统) 5.2.1 ls /proc/PID 5.2.2 ls /proc/PID -al ​ 5…

B/B+树与mysql索引

数据结构操作网站&#xff1a;https://www.cs.usfca.edu/~galles/visualization/Algorithms.html B树 算法平均最差空间O(n)O(n)搜索O(log n)O(log n)插入O(log n)O(log n)删除O(log n)O(log n) B树 算法平均最差空间O(n)O(n)搜索O(log n)O(log n)插入O(log n)O(log n)删除O(…

SQL命令详解之增删改数据

目录 简介 1 添加数据 1.1 基础语法 1.2 SQL 练习 2 修改数据 2.1 基础语法 2.2 SQL 练习 ​3 删除数据 3.1 基础语法 3.2 SQL 练习 总结 简介 在数据库操作中&#xff0c;增、删、改是最基础的操作&#xff0c;它们通常对应着SQL中的INSERT、DELETE和UPDATE命令。…

爱普生可编程晶振 SG-8101CE 在智能家居领域展现出的优势

在智能家居的全场景应用中&#xff0c;设备间的协同效率、数据传输的稳定性以及系统运行的可靠性&#xff0c;成为衡量用户体验的核心标准。爱普生 SG-8101CE 可编程晶振以其卓越的性能&#xff0c;为智能门锁、传感器、中控系统等设备提供核心动力&#xff0c;助力厂商打造更可…

Pytest之fixture的常见用法

文章目录 1.前言2.使用fixture执行前置操作3.使用conftest共享fixture4.使用yield执行后置操作 1.前言 在pytest中&#xff0c;fixture是一个非常强大和灵活的功能&#xff0c;用于为测试函数提供固定的测试数据、测试环境或执行一些前置和后置操作等&#xff0c; 与setup和te…

植物大战僵尸金铲铲版 v1.1.6(windows+安卓)

游戏简介 《植物大战僵尸金铲铲版》是由“古见xzz”、“对不起贱笑了”、“是怪哉吖”等联合开发的民间魔改版本&#xff0c;融合了原版塔防玩法与《金铲铲之战》的自走棋元素&#xff0c;属于非官方同人作品。 游戏特点 合成升星机制&#xff1a;三个相同低星植物可合成更高…

Matplotlib基础知识总结

1、简介 安装使用pip install matplotlib命令即可&#xff1b; 2、基本绘图流程 3、pyplot基础语法 &#xff08;1&#xff09;创建画布与创建子图 figure语法说明&#xff1a;figure(numNone, figsizeNone, dpiNone, facecolorNone, edgecolorNone, frameonTrue)&#xff1…

实例分割 | yolov11训练自己的数据集

前言 因工作要求使用的都是yolov5系列的模型&#xff0c;今天学习一下最先进的yolov11&#xff0c;记录一下环境配置及训练过程。 1.项目下载及环境安装 源码位置&#xff1a;yolov11 可以看到&#xff0c;这里要求python版本大于等于3.8&#xff0c;我这里安装python3.10.…

【MongoDB】在Windows11下安装与使用

官网下载链接&#xff1a;Download MongoDB Community Server 官方参考文档&#xff1a;https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-windows/#std-label-install-mdb-community-windows 选择custom类型&#xff0c;其他默认 注意&#xff0c;此选…

【prometheus】Pushgateway安装和使用

目录 一、Pushgateway概述 1.1 Pushgateway简介 1.2 Pushgateway优点 1.3 pushgateway缺点 二、测试环境 三、安装测试 3.1 pushgateway安装 3.2 prometheus添加pushgateway 3.3 推送指定的数据格式到pushgateway 1.添加单条数据 2.添加复杂数据 3.SDk-prometheus-…

Python中文自然语言处理库SnowNLP

SnowNLP 介绍 SnowNLP 是一个基于 Python 的中文自然语言处理库&#xff0c;专为处理中文文本而设计。它受到 TextBlob 的启发&#xff0c;但与 TextBlob 不同的是&#xff0c;SnowNLP 没有使用 NLTK&#xff0c;所有的算法都是自己实现的&#xff0c;并且自带了一些训练好的字…

windows共享文件夹到麒麟桌面操作系统操作步骤

此文档是将windows的共享文件夹在麒麟桌面操作系统里实现访问。该文档是以windows11+kylinos-2303为例编写。 1、在windows上新建文件夹 2、右击myshare文件夹,点击属性,在属性窗口中点击【共享】页签,点击【共享】 3、点击文本框后边的向下箭头,选择Everyone,后点击…