JVM StringTable

news2024/11/24 13:39:07

文章目录

  • 学习资料
  • StringTable
    • String的基本特性
    • String的内存分配
      • StringTable为什么要调整?
    • String的基本操作
    • 字符串拼接操作
      • 拼接操作与append操作的效率对比
    • intern()的使用


学习资料

【尚硅谷宋红康JVM全套教程(详解java虚拟机)】
【阿里巴巴Java开发手册】https://www.w3cschool.cn/alibaba_java
JDK 8 JVM官方手册

StringTable

String的基本特性

String:字符串,使用一对“”引起来表示。

String声明为final的,不可被继承。

String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小。

String在jdk8及以前内部定义了final char[] value用于存储字符串数据。jdk9时改为byte[]。

String:代表不可变的字符序列。简称:不可变性
1、当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
2、当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。

通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。

字符串常量池中是不会存储相同的内容的字符串的。

String的String Pool是一个固定大小的HashTable,默认值大小长度是1009。如果放进String Pool的String非常多,就会造成Hash冲突严重,从而导致链表会很长,而链表长了后直接会造成的影响就是当调用String.intern时性能会大幅下降。

使用-XX:StringTableSize可设置StringTable的长度。

在jdk6中StringTable是固定的,就是1009的长度,所以如果常量池中的字符串过多就会导致效率下降很快。StringTableSize设置没有要求。

在jdk7中,StringTable的长度默认值是60013

在jdk8中,StringTable的长度默认值是60013,1009是可设置的最小值。

String的内存分配

在Java语言中有8种基本数据类型和一种比较特殊的类型String。这些类型为了使它们在运行过程中速度更快、更节省内存,都提供了一种常量池的概念。

常量池就类似一个Java系统级别提供的缓存。8种基本数据类型的常量池都是系统协调的,String类型的常量池比较特殊。它的主要使用方法有两种。
1、直接使用双引号声明出来的String对象会直接存储在常量池中,比如:String info = “diuxz.cn”;
2、如果不是用双引号声明的String对象,可以使用String提供的intern()方法。

Java6及以前,字符串常量池存放在永久代。
Java7中Oracle的工程师对字符串池的逻辑做了很大的改变,即将字符串常量池的位置调整到Java堆内。
1、所有的字符串都保存在堆(Heap)中,和其他普通对象一样,这样可以让你在进行调优应用时仅需要调整堆大小就可以了。
2、字符串常量池概念原本使用的比较多,但是这个改动使得我们有足够的理由让我们考虑在Java7中使用String.intern()。
Java8元空间,字符串常量在堆。

StringTable为什么要调整?

1、permSIze默认比较小;2、永久代垃圾回收频率低;

JDK 7中将StringTable放到了堆空间中。因为永久代的回收效率很低,在full gc的时候才会触发、永久代不足时才会触发。这就导致StringTable回收效率不高。而我们开发中会有大量的字符串被创建,回收效率低,导致永久代内存不足。放到堆里能及时回收内存。

String的基本操作

在这里插入图片描述

字符串拼接操作

常量与常量的拼接结果在常量池,原理是编译期优化。
在这里插入图片描述
在这里插入图片描述

常量池中不会存在相同内容的常量。
在这里插入图片描述

只要其中有一个是变量,则相当于在堆空间中new String(),具体的内容为拼接的结果,结果就在堆中。变量拼接的原理是StringBuilder。
在这里插入图片描述

字符串拼接操作不一定使用StringBuilder!
如果拼接符号左右两边都是字符串常量或常量引用,则仍然使用编译期优化,即非StringBuilder的方式。
在这里插入图片描述
在这里插入图片描述
针对于final修饰类、方法、基本数据类型、引用数据的量的结构时,能使用上final的时候建议使用上,这样能更好的使用编译期优化。

如果拼接的结果是调用intern()方法,则主动将常量池中还没有的字符串对象放入池中,并返回此对象地址,如果存在,则返回常量池中的地址。

拼接操作与append操作的效率对比

体会执行效率:通过StringBuilder的append()的方式添加字符串的效率要远高于使用String的字符串拼接方式!
详情:
1、StringBuilder的append()的方式:自始至终值创建过一个StringBuilder的对象。
2、使用String的字符串拼接方式:创建过多个StringBuilder和String的对象。
3、使用String的字符串拼接方式:内存中由于创建了较多的StringBuilder和String的对象,内存占用更大,并且更容易触发GC,严重影响效率。
改进空间:在实际开发中,如果基本确定前前后后添加的字符串长度不高于某个限定值的情况下,建议使用构造器new StringBuilder(int capacity);实例化。

package com.atguigu.java;

public class StringTest4 {

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        //method1(100000);//花费的时间为:3484
        //method2(100000);//花费的时间为:7
        long end = System.currentTimeMillis();
        System.out.println("花费的时间为:" + (end - start));
    }

    public static void method1(int highLevel){
        String src = "";
        for(int i = 0; i < highLevel; i++){
            src = src + "a";//每次循环都会创建一个StringBuilder
        }
    }

    public static void method2(int highLevel){
        //只需要创建一个StringBuilder
        StringBuffer src = new StringBuffer();
        for(int i = 0; i < highLevel; i++){
            src.append("a");
        }
    }
}

intern()的使用

如果不是用双引号声明的String对象,可以使用String提供的intern方法:intern方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中。
比如:String myInfo = new String(“diuxz.cn”).intern();

也就是说,如果在任意字符串上调用String.intern方法,那么其返回结果所指向的那个类实例,必须和直接以常量形式出现的字符串实例完全相同。因此下列表达式的值必定是true:
(“a” + “b” + “c”).intern() == “abc”

通俗点讲,Interned String就是确保字符串在内存里只有一份拷贝,这样可以节约内存空间,加快字符串操作任务的执行速度。注意:这个值会被存放在字符串内部池(String Intern Pool)。

大的网站平台,需要内存中存储大量的字符串。比如社交网站,很多人都存储:北京市、海淀区等信息。这时候如果字符串都调用intern()方法,就会明显降低内存的大小。

    public static void main(String[] args) {
        String s = new String("1");//字符串常量池、堆空间,分别创造两个对象,返回堆空间中的对象
        s.intern();//返回字符串常量池对象,调用此方法之前,字符串常量池中已经存在了“1”
        String s2 = "1";//返回字符串常量池对象
        System.out.println(s == s2);//false,s是堆空间的对象,s2是字符串常量池的对象

        String s3 = new String("1") + new String("1");//s3变量记录的地址为:new String(11)
        //执行完上一行代码后,字符串常量池中不存在“11”,因为StringBuilder.toString()的调用,在字符串常量池中不生成“11”
        s3.intern();//在字符串常量池中生成“11”
        String s4 = "11";//使用的是上一行代码执行时在常量池中生成的“11”的地址
        System.out.println(s3 == s4);//true,使用的共同的常量池地址
    }

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

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

相关文章

prometheus exporter 监控主机

前提要求部署Grafana 前言 有许多库和服务器可以帮助将第三方系统中的现有指标导出为Prometheus指标。在无法直接使用Prometheus度量(例如&#xff0c;HAProxy或Linux系统统计数据)对给定系统进行检测的情况下&#xff0c;这是非常有用的。 node-exporter Linux操作系统采集&…

【Hack The Box】windows练习-- Scrambled

HTB 学习笔记 【Hack The Box】windows练习-- Scrambled &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &…

第2-3-5章 删除附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss

文章目录5.4 接口开发-根据id删除附件5.4.1 接口文档5.4.2 代码实现5.4.3 接口测试5.4.4 测试ALI和FAST_DFS以及MINIO上传和删除的接口5.4.4.1 阿里云OSS上传和删除5.4.4.2 FastDFS上传和删除5.4.4.3 Minio上传和删除5.5 接口开发-根据业务类型/业务id删除附件5.5.1 接口文档5.…

[附源码]SSM计算机毕业设计成都团结石材城商家协作系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

力扣(LeetCode)6. Z 字形变换(C++)

数学构造 ZZZ 字形变换类似情报加密。找规律解密&#xff0c;就能得到构造的方法。 第 000 行相邻的数&#xff0c;取 n4n4n4 如上图&#xff0c;观察第 000 行和第 333 行 相邻的数&#xff0c;组成等差数列&#xff0c;公差 d62n−2d62n-2d62n−2 2n−22n-22n−2 是说 &…

【小程序】微信小程序云开发笔记详细教程(建议收藏)

1- 前言 1.1 微信云开发是什么&#xff1f; 微信云开发是微信团队联合腾讯云推出的专业的小程序开发服务。 开发者可以使用云开发快速开发小程序、小游戏、公众号网页等&#xff0c;并且原生打通微信开放能力。 开发者无需搭建服务器&#xff0c;可免鉴权直接使用平台提供的…

Spring Cloud | 实现Eureka Server 高可用服务注册中心全套解决方案

目录1、在搭建Eureka Server&#xff0c;配置高可用服务注册中心&#xff0c;配置3个Eureka Server:2、因为是在本地实现的话&#xff0c;需要在localhost加入三个服务&#xff0c;需要改变etc/hosts&#xff0c;linux系统通过vim /etc/hosts&#xff0c;3、如果是在测试或者是…

最优孤岛划分下含分布式电源配电网可靠性评估附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

小学生python游戏编程arcade----坦克大战(1)

小学生python游戏编程arcade----坦克大战&#xff08;1&#xff09;前言坦克类&#xff0c;地图&#xff0c;角色的控制&#xff0c;声音等前期学习的汇总1、坦克类2、title地图加载2.1设置&#xff0c;tank类的引入2.2 角色的引入2.3 效果图2.4 代码实现总结源码获取前言 接上…

kafka学习之基本概念

一、kafka常用基本概念 producer&#xff1a;生产者&#xff0c;生产并发送消息的一方。 consumer&#xff1a;消费者&#xff0c;接收消费消息的一方。 topic&#xff1a;一类消息的集合。在kafka中&#xff0c;消息以主题为单位进行归类&#xff0c;producer负责将消息发送…

云服务器 宝塔部署SpringBoot前后端分离项目

&#x1f986;博主介绍&#xff1a;小黄鸭技术 &#x1f308;擅长领域&#xff1a;Java、实用工具、运维 &#x1f440; 系列专栏&#xff1a;&#x1f4e2;开发工具 Java之路 八股文之路 &#x1f4e7;如果文章写作时有错误的地方&#xff0c;请各位大佬指正&#xff0c;一起进…

舆情监控究竟是什么?怎么运作的?

本文首发于&#xff1a;行者AI谛听 随着互联网的加速变化&#xff0c;舆论已成为影响国家政治、社会生活和公众情绪的重要因素&#xff0c;也是影响企业形象和长远发展的重要因素。能及时收集精准措施以及预防减少和消除舆论带来的影响&#xff0c;是行业长远发展的关键条件。下…

泰凌微蓝牙 HCI层事件的注册和使用

Controler HCI event是通过HCI将Controller所有的event报告给Host HCI event是按BLE Spec标准设计的&#xff0c;是BLE Controller和Host用来交互的事件&#xff1b;GAP event是BLE host定义的一些协议栈流程交互时间通知型事件。 HCI event类型 #define HCI_EVT_DISCONNEC…

【Hack The Box】windows练习-- Object

HTB 学习笔记 【Hack The Box】windows练习-- Object &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1…

链表oj题(第一弹)

通过前两篇博客我们了解了链表的实现&#xff0c;那么今天我们来看看链表的oj题是如何完成的。 1、移除链表元素 题目要求我们删掉与val相同的节点。 方法一&#xff1a;我们可以写一个循环&#xff0c;首先创建两个节点&#xff0c;一个头节点&#xff0c;一个尾节点&#x…

Jmeter常用函数__V和__intSum

文章目录一、__V详解1、作用2、示例二、__intSum详解1、作用2、示例三、示例--随机用户名四、示例--随机对应的用户名和密码一、__V详解 1、作用 执行变量表达式&#xff0c;并返回执行的结果可以执行嵌套函数 2、示例 1、固定值和随机数组合 ${__V(1.${__Random(1,10,)})}…

[附源码]java毕业设计民宿客栈管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[Python]Django 模型

&#x1f349; 前言 系列文章目录 [Python]目录 文章目录&#x1f349; 前言&#x1f349; Django 模型&#x1f349; 定义模型&#x1f95d; 语法&#x1f95d; 常用模型字段类型&#x1f951; AutoField&#x1f951; BooleanField&#x1f951; NullBooleanField&#x1f95…

【服务器搭建】教程二:快速搭建我们服务器 进来看

前言&#xff1a; 购买一台服务器&#xff0c;再来个域名&#xff0c;搭建一个自己的个人博客&#xff0c;把一些教程、源码、想要分享的好玩的放到博客上&#xff0c;供小伙伴学习玩耍使用。 我把这个过程记录下来&#xff0c;想要尝试的小伙伴&#xff0c;可以按照步骤&#…

Jmeter连接数据库_postgresql

文章目录一、下载驱动包&#xff08;.jar&#xff09;1. 下载对应的安装包2、放在Jmeter的lib目录下二、Jmeter中的操作1、测试计划2、JDBC Connection Configuration3、JDBC Request三、具体示例一、下载驱动包&#xff08;.jar&#xff09; 不同的数据区需要的驱动包不同&am…