深入解析:JVM(六)-- StringTable

news/2025/9/25 17:08:23/文章来源:https://www.cnblogs.com/yfceshi/p/19111564

目录

一、String的基本特性

1. 特性

2. String的内存分配​编辑

3. 字符串拼接操作

二、intren()的使用


一、String的基本特性

1. 特性

JDK9改为byte类型的目的是为了节省内存

字符串常量池(String Constant Pool)中存储的是 ​字符串对象本身的引用​(在 Java 7 及之后版本)。更准确地说:

2. String的内存分配

Java6及以前,字符串常量池存放在永久代当中。

Java7中,字符串常量池的位置调整到Java堆中。之后字符串常量池都在堆中。

StringTable为什么要进行调整?

永久代默认比较小;永久代的垃圾回收频率很低,容易报OOM异常。

3. 字符串拼接运行

看下面的两个例子:

因为s1是常量的拼接,故而它与s2指向的是常量池中的同一个位置。

s4是变量进行拼接的,所以和s3指向的就不是同一个地址,所以答案是false。s4指向的对象在堆中,s3指向的地址在字符串常量池中。

二、intren()的使用

当采用intern方法的时候,intern方式会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池当中。

intern是一个方法调用,它的核心作用就是主动将堆中的该字符串对象“放入”字符串常量池,并返回池中的引用如果池中已经存在内容相等的字符串,则直接返回池中那个字符串的引用。倘若池中没有,则不会在常量池中再创建一个副本,而是会将堆中这个对象的引用记录在常量池中,并返回这个引用

看下面的这个例子:

1. 首先,第一行代码就相当于是String s3 = new String("11");第一行代码执行完之后,内存中会存在四个字符串对象。

对象A(常量池中):由于使用了字面量 "1",在类加载时,JVM会确保字符串常量池中已经存在内容为 "1"的字符串对象。

对象B、C(堆中):new关键字会在堆内存中创建一个全新的、独立的 String对象,其内容也是 "1"

对象D(堆中):new关键字会在堆内存中创建一个全新的、独立的 String对象,其内容是 "11"

2. 第二行代码,String s4 = "11",缘于此时字符串常量池中并没有“11”这个字符串,因此会在字符串常量池中创建一个对象E,内容为“11”。

3. 第三行代码。s3.intern()。​因为常量池中已存在内容为 "11"的对象E,所以 intern()方法会返回对象E的引用。但是!​​ 这里有一个非常重要的细节:代码是 s3.intern();而不是 s3 = s3.intern();。这意味着虽然 intern()方法返回了常量池的引用,但这个返回值并没有被任何变量接收。变量 s3仍然指向堆中的对象D,它的指向没有发生任何改变。

所以,上述代码的结果返回是false。

要是我们把上述代码顺序调换一下,如下图:

1. 首先,第一行代码就相当于是String s3 = new String("11");第一行代码执行完之后,内存中会存在四个字符串对象。

对象A(常量池中):由于使用了字面量 "1",在类加载时,JVM会确保字符串常量池中已经存在内容为 "1"的字符串对象。

对象B、C(堆中):new关键字会在堆内存中创建一个全新的、独立的 String对象,其内容也是 "1"

对象D(堆中):new关键字会在堆内存中创建一个全新的、独立的 String对象,其内容是 "11"

2. 第二行代码。s2.intern(),因为此时字符串常量池中并没有内容为“11”的字符串对象。所以,并不会在常量池中再创建一个副本,而是会将堆中这个对象的引用记录在常量池中,并返回这个引用(称为引用P)。

true。就是3. 第三行代码。String s4 = "11"。因为字符串常量池中已经有了“11”这个字符串的引用P,所以会直接将引用P赋值给s4,又基于引用P指向的是s3的地址空间,因此就相当于s4直接指向了s3的地址空间。因此结果就

值得注意的是String s = "1"该代码,并不是直接在字符串常量池中存储“1”这个字符串。而是编译器在堆中创建了一个字符串对象,内容为“1”。字符串常量池中存储的是该对象的引用而已。String s = new String("1"),是创建了两个对象,一个对象在常量池中有引用,另一个则没有。

总结:

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

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

相关文章

开发一个彩票网站多少钱济南医院网站建设服务公司

来源:AI科技评论作者:陈彩娴、Mr Bear编辑:青暮近日,图灵奖得主、“贝叶斯网络之父”Judea Pearl在Twitter上分享了一篇新论文“What are the most important statistical ideas of the past 50 years?”(过去50年中最…

医院网站系统源码怎么推广引流

Linux平台 一、从yum源脚本安装部署Zabbix-Agent,添加Linux Servers/PC 概述 Zabbix 主要有以下几个组件组成: Zabbix Server:Zabbix 服务端,Zabbix的核心组件,它负责接收监控数据并触发告警,还负责将监控数据持久化到数据库中。 Zabbix Agent:Zabbix客户端,部署在被监…

国产智能体脂秤PCBA方案设计

一、产品介绍:智能体脂秤是一款高精度、多功能的健康管理工具,通过测量身体脂肪百分比、肌肉质量、骨骼密度等参数,帮助用户了解自身身体健康状况,并提供个性化的健康建议。其结构设计紧凑,外观简约时尚,适用于家…

完整教程:JRE、JDK、JVM 及 JIT 之间有什么不同?

完整教程:JRE、JDK、JVM 及 JIT 之间有什么不同?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

第15章 day18 Ast系列篇

Ast系列篇 何为混淆? 混淆可以理解为是一种对js代码加密技术,主要用于隐藏代码的真实功能,以防止js代码被逆向工程师分析和修改。通过混淆,让代码变得复杂和难以理解,使得逆向工程师在调试工程中消耗大量的时间或…

微波雷达模块在智能家居中的具体应用案例有哪些?

​微波雷达模块在智能家居中的具体应用案例有哪些?首先我们要明确什么是微波雷达? 微波是指频率在300MHz至300GHz之间的电磁波,其波长范围从1米到1毫米不等。微波具有穿透性、反射性和热效应等特点,因此在通信、加…

Ubuntu 桌面快捷方式创建增加记录

使用图形界面创建桌面快捷方式打开终端进入 GoLand 的 bin 目录:cd ~/Apps/GoLand-2024.1/bin创建桌面快捷方式文件:sudo nano /usr/share/applications/goland.desktop编写内容到文件中:[Desktop Entry] Version=1…

网站 wap 插件长春火车站是哪个站

1、 Lua:元表是什么,怎么实现对象继承 2、OPP是什么 3、mvc结构 4、C#: list和array区别和使用场景 5、项目: (1)ui框架类设计,ui层级管理怎么做,对象初始化内存占用这样做高,资源是…

arm64中的内存屏障指令

asm volatile("dmb osh" : : : "memory")是什么? arm架构有三种内存屏障,分别是: Data Memory Barrier, Data Synchronization Barrier, and Instruction Synchronization Barrier. OSH表示DMB…

三分

篇首语啊~~三分~你比二分多一分~——A86562U正文 顾名思义,三分会比二分多一个分区,但它是用来做什么的呢?先来偷一道拿一道例题来举例 P3382 三分 - 洛谷 我们把二分的模板偷一份拿一份过来#include<bits/stdc+…

完整教程:微服务基础2-网关路由

完整教程:微服务基础2-网关路由pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

第21章 Day25 抖音最新ab

import requests import execjs import urllib.parsecookies = {enter_pc_once: 1,UIFID_TEMP: 163eead721bc91ca6f3a3cb4766a73c0638fabced1012e02c28bcbf3169aca5c44c51fa6beff8f1f2615be624638d06da543fe1615ff22d8…

东莞seo网站优化运营携程网站建设的意义

目录 前言1. 原理分析2. 解决方法3. 彩蛋前言 一时用不了软件,安装修复的时候也出现问题 DISM一直卡在63.2%,等了好久时间,直接强制退出寻找最终的解决方案 1. 原理分析 基本的原理查看:清理 WinSxS 文件夹 官网 主要有如下原因: 系统更新服务导致问题的存在系统文件…

wordpress模板获取数据库桂林网站seo

本文来源公众号“萝卜大杂烩”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;Polars (最强Pandas平替) 本文章转自&#xff1a;数据studio 1 介绍 Polars是一个用于操作结构化数据的高性能DataFrame库&#xff0c;可以说是平替…

nginx ipv6 proxy配置

方式一:采用upstream方式upstream npmgmt.net.cmft {server 10.126.11.4:7070 weight=1 fail_timeout=10s max_fails=1 ;server [2409:8095:8110:1006::a7f:b60a];} server { server_name npmgmt.net.cmft; …

(三)数仓人必看!ODS 到 DWS 各层设计规范全解析,含同步/存储/质量核心要点

本文为系列文章第三篇,详细剖析了数仓各层的设计规范,包含同步、存储、质量等核心要点。《新兴数据湖仓设计与实践手册数据湖仓建模及模型命名规范(2025年)》 由四篇递进式指南组成,以“模型架构—公共规范—分层…

【shell】系统资源不足fork: retry: Resource temporarily unavailable

“fork: retry: Resource temporarily unavailable”通常,这种错误是由于系统资源不足,特别是进程数或内存不足导致的。 如何查看系统进程数限制及当前使用进程数:#当前系统限制 ulimit -u#当前所有用户占用的进程树…

商务网站制作语言基础c 转网站开发

谷歌现在越来越不按常理出牌了&#xff0c;今天早些时候&#xff0c;他们已经提前秀出了Android 7.0。从最新亮相的Android N开发者预览版来看&#xff0c;谷歌进行了一些调整&#xff0c;但更重要的是&#xff0c;增加了一些新的功能&#xff0c;比如分屏、新的通知控制等。那…

问答社区网站建设西宁网站建设价格低

和Stock一样&#xff0c;用户通常要创建同一个类的多个对象。可以创建独立对象变量&#xff0c;就像本章前面的示例所做的&#xff0c;但是创建对象数组将更合适。其实声明对象的方法与声明标准类型数组相同&#xff1a; Stock mysuff[4]; 当程序创建未被显式初始化的类对象时…

网站开发项目计划书服务号 wordpress

作者&#xff1a;张慧,王坤峰,王飞跃来源&#xff1a;王飞跃科学网博客摘要&#xff1a;目标视觉检测是计算机视觉领域的一个重要问题&#xff0c;在视频监控、自主驾驶、人机交互等方面具有重要的研究意义和应用价值.近年来&#xff0c;深度学习在图像分类研究中取得了突破性进…