关于StringTable的设置,看这篇文章就够了

前面几节我们讲解了关于java8中String的特性,提到了字符串常量池在创建String对象的过程中所起到的关键作用,同时也提到了字符串字面量和StringTable的概念,以及使用java.lang.String#intern方法将字符串加入字符串常量池的用法。本节我们主要讲解下,如何直观的查看字符串字面量和JVM提供的有关StringTable的虚拟机参数。

一、如何使用命令查看字面量字符串

我们知道字符串字面量在编译期间就已经确定了,在类加载器加载类时,将字符串加载到字符串常量池StringTable中,以便运行期复用,所以我们使用以下命令即可查看

javap -verbose Main.class(class文件名)

我们定义如下类并使用上述命令在cmd窗口查看回显结果,我们定义的字面量“abc”已经显示在了Constant pool中。

public class Main {
    public static void main(String[] args) {
        String str1 = "abc";
        System.out.println(str1);
    }
}

二、JVM提供的和SringTable相关的参数有哪些?

JVM未直接提供可以查看运行时StringTable的具体信息的JVMTI,也就是说我们无法知道在运行期间,字符串常量池的具体情况。但官方给出了两个参数-XX:StringTableSize=N和-XX:+
PrintStringTableStatistics,详细介绍如下:

-XX:StringTableSize 
含义:配置字符串常量池中的StringTable大小,默认:60013 (Number of buckets in the interned String table) ,StringTable数据结构是hashtable,这个值就是hashtable的size大小,建议设置成大一点的质数
-XX:+PrintStringTableStatistics  
含义:在JVM进程退出时,打印出StringTable的统计信息输出到gclog中.

这里我们给出一个打印的样例,里面有存储情况的详细信息,感兴趣的可以仔细研读下:

因篇幅限制,这部分知识就介绍到这里,下一节我们将讲解String,StringBuilder和StringBuffer的使用场景和从源码上剖析他们的区别,感兴趣的小伙伴可以关注作者,一起学习交流,谢谢大家!

历史文章链接:

关于String的常见疑问解答

相关文章

底层原理深度解析:equals() 与 == 的 JVM 级运作机制

作为 Java 开发者,你是否曾在集合操作时遇到过对象比较的诡异问题?是否在使用 HashMap 时发现对象丢失?这些问题往往源于对 equals() 和 == 的误解,以及实体类中这两个方法的不当实...

25条很棒的Python一行代码,建议收藏

自从我用Python编写第一行代码以来,就被它的简单性、出色的可读性和特别流行的一行代码所吸引。在下面,我将给大家介绍并解释一些Python一行程序。可能有些你还不知道,但对你未来的Python项目很...

期末秘籍|VB、C语言、C++、知识太多太复杂?编程大神带你划重点啦

VB、C语言、C++考试纷纷来临面对浩如烟海的编程知识从哪里着手复习一度令人头大于是团子们邀请到了两位编程大佬来为大家讲解编程类课程最重要的考点快快拿出小本本记下有用的复习知识吧##大佬一号7年C++...

别急着敲代码!学计算机的5个"反常识"忠告!

当你第一次在屏幕上打印出"Hello World",当你用代码画出第一个像素点,当你成功让机器人说出一句完整的话等等——这些魔法时刻,就像是计算机世界给你的第一封情书。但在这个充满魅力...

142 秒解大厂笔试题!通义灵码让算法面试不再“地狱难度”

在AI技术狂飙突进的今天,程序员如何借力 AI 突破职业瓶颈?阿里云最新推出的通义灵码插件给出了答案!这款智能编码助手近期完成升级,在代码生成、算法解题能力全面领先。当其他开发者还在为LeetCode...