常量池-JVM(十九)

news/2024/7/7 7:55:57

上篇文章说gc日志以及arthas。

Arthas & GC日志-JVM(十八)

一、常量池

常量池主要放两大类:字面量和符号引用。

字面量就是由字母、数字等构成的字符串或者数值常量。

符号引用主要包含三类常量。

  1. 类和接口的全限定名。
  2. 字段的名称和描述符。
  3. 方法的名称和描述符。

  • 字符串常量池

Jkd1.6之前:有永久代,运行时常量池在永久代,运行时常量池里包含字符串常量池。

Jdk1.7:有永久代,但逐步去掉永久代,字符串常量池从运行时常量池分离到堆里。

Jdk1.8之后:无永久代,运行时常量池在元空间,字符串常量池还在堆里。

1、字符串常量池设计思想

因为字符串和对象分配一样,要耗费时间和空间代价较大,作为基础数据,频繁创建字符串对代码性能有影响,为了提高效率,则为字符串开辟字符串缓存区,创建字符串前先在字符串常量池判断是否存在,存在则引用该实例,不存在则放入字符串缓冲区。

  1. 实际操作

String s = “zhangsan”;

这时候s指向字符串常量池的引用。使用的时候先会去字符串常量池equals比较,一样则直接返回,不一样才会放入字符串缓冲区。

String s1 = new String(“zhangsan”);

S1指向内存对象引用。

这种方法会保证字符串常量池和堆都有这个对象,没有就创建,最后返回堆内存中对象引用。

先去字符串常量池创建字符串对象,再去堆里创建字符串对象“zhangsan”, 最后直接将内存中的引用返回。

String s1=new String(“zhangsan”);

String s2=s1.intern();

System.out.println(s1 == s2);//false

Intern方法是native修饰,先去常量池先找字符串对象,有的话直接返回,没有直接返回指向字符串s1堆里对象的引用。

再看特殊的例子:

 

String str2 = new StringBuilder(“计算机”).append(“技术”).toString();

System.out.println(str2 == str2.intern())

这个为什么输出的true呢?

在堆内存是有StringBuilder对象,但是会被gc回收,toString则会new String(),这个才是正在返回对象引用。

“计算机技术”没有在常量池中,但在heap堆中,intern则会直接返回堆的引用,所以true。

而“java”属于关键字,早就在常量池,引用对比则是false。


http://www.niftyadmin.cn/n/4924509.html

相关文章

lab7 proxylab

前情提要,如果看了书本,这个lab难度不高,但是如果不看书,难度还是挺高的,并且这个lab会用到cachelab中学到的东西,需要阅读 第十章:系统编程第十一章:网络编程第十二章:…

【腾讯云 Cloud Studio 实战训练营】使用 Cloud Studio 快速构建 Vue + Vite 完成律师 H5 页面

【腾讯云 Cloud Studio 实战训练营】使用 Cloud Studio 快速构建 Vue Vite 完成律师 H5 页面 前言一、基本介绍1.应用场景2.产品优势 二、准备工作1.注册 Cloud Studio2.进入 Vue 预置开发环境 三、使用 Cloud Studio 快速构建 Vue Vite 完成律师 H5 页面1.安装相关依赖包2.主…

SpringBoot+JWT

一、maven坐标 <!-- JWT依赖 --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><dependency><groupId>com.auth0</groupId>&…

vite项目中使用@代表根路径

1.配置vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from pathexport default defineConfig({plugins: [vue()],resolve: {alias:{: path.resolve(__dirname, src) }} })2.报错path和__dirname 找不到模块“path”或其相…

一文解决JWT相同签名不匹配问题【JWT signature does not match locally computed signature.】

今天做项目的时候&#xff0c;涉及到一个支付记账的功能&#xff0c;想着不能将这些金额数据显示暴露的通过常规的请求体封装来进行传输&#xff0c;想着要是被中途抓包修改了不就麻烦了&#xff0c;所以考虑到这种安全性的需求&#xff0c;就利用上了JWT来进行数据的封装传递&…

激活函数总结(一):ReLU及其变体

激活函数总结&#xff08;一&#xff09; 1 引言2 常用激活函数介绍2.1 Sigmoid激活函数2.2 Tanh激活函数2.3 ReLU激活函数2.4 Leaky ReLU激活函数2.5 Parametric ReLU&#xff08;PReLU&#xff09;激活函数2.6 Swish激活函数 3. 总结 总结的激活函数都在目录中有所展示&#…

@MapperScan 和 @Mapper 源码解读

一.从开发中遇到的问题开始 问题描述 : 在一个springbootmybatis的项目中,在dao也就是Mapper接口上配置了Mapper注解&#xff0c;其他同事在启动类还配置了MapperScan注解&#xff08;包扫描没有配全面&#xff09;&#xff0c;进行批量指定所生成的Mapper接口动态代理接口类&a…

wsl(在windows中使用呢linux系统)适用于windows的linux子系统

步骤可参考微软官方文档https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4—download-the-linux-kernel-update-package 在这里主要列举一些需要注意的点 wsl2的要求 一定要检查下windows版本&#xff0c;版本不对的先升级版本不然无法使用wsl2 wsl支持…