有时候也会面试别人,也会被别人面试,问题基本上都会牵扯到String案例,例子都会牵扯到hashcode、equal这些,但是回答的时候基本上是照本宣科的方式应付,今天给大家普及下一些基础String JVM memory internals,以便于大家能够在基础方面有点不一样回答,给面试官留下深刻印象。
因为在类的编译中会使用到javap -c -verbose,最好大家能够预先普及下知识Understanding javap’s output for the Constant Pool。
也有涉猎到基本的抽象树的一些知识,如果不知道可以通过插件方式安装,挺简单的。地址plugin:
jdtview - http://www.eclipse.org/jdt/ui/update-site
如图:
Java code
String str1 = "abc"; String str2 = "abc"; String str3 = "abc3";
Class constant pool
每个类都有自己的 constant pool ,它包括了strings, numbers, method names等。
Javap -c -verbose TestClass.class
constant pool 条目中只存在了abc和abc3这是非常重要的依据
Byte code
HashCode
java的代码
import java.lang.reflect.Field; public class TestClass { public static void main(String[] args) throws Exception { String str1 = "abc"; String str2 = "abc"; String str3 = "abc"; System.out .println("str1.value: " + showInternalCharArrayHashCode(str1)); System.out .println("str2.value: " + showInternalCharArrayHashCode(str2)); System.out.println("str1" + System.identityHashCode(str1)); System.out.println("str2" + System.identityHashCode(str2)); } private static int showInternalCharArrayHashCode(String s) throws Exception { final Field value = String.class.getDeclaredField("value"); value.setAccessible(true); return value.get(s).hashCode(); } }
print:
str1.value: 23660326 str2.value: 23660326 str15538765 str25538765
现在代码改变为
String str1 = "abc"; String str2 = "abc"; String str = new String("abc");
Javap -c -verbose TestClass.class
很明显看到新生成对象,且调用了默认的构造函数
HashCode
str1.value: 23660326 str2.value: 23660326 str15538765 str210039797
what a amazing!
为何下面一对的结果是不一致,明显是两个不同对象啊?可以参考String(String)
constructor works
public String(String original) { this.offset = original.offset; this.count = original.count; this.value = original.value; }
Runtime modification and intern()
String str1 = "abc"; String str2 = "?abc".substring(1);
str1.value: 23660326 str2.value: 5538765 str110039797 str227189676
明显不一样的两个对象
Java Code
String str1 = "abc"; String str2 = "?abc".substring(1); str2 = str2.intern();
str1.value: 23660326 str2.value: 23660326 str15538765 str25538765
通过intern,对象的值和引用又捆绑在一起。想知道答案吗?
a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.
不知道对于初学者或者在应聘中被问到过该问题的童鞋有没有帮助?请给予反馈
相关推荐
jvm memory
"JVM Memory View"工具,版本号为0.93.162,就是针对这一需求而设计的JVM调试内存查看器,专为Android Studio用户提供了一个直观、高效的内存分析解决方案。 一、JVM内存概述 Java虚拟机内存主要分为以下几个区域...
很久之前就一直在学习JVM,但是一直也没有好好的总结,最近终于有了空闲,将之前学习的内容整理成了一个PPT。PPT也可以在这里下载: https://github.com/hitynsun/docs/tree/master/JVM 也希望大神们可以批评指正...
JVM(Java虚拟机)是Java平台的核心组件,提供了一个抽象的计算环境,使得Java程序能够在不同的操作系统上运行,实现平台独立性。JVM将Java程序编译成特定的二进制格式——类文件格式,使得Java虚拟机本身对Java编程...
《深入解析MemoryAnalyzer:JVM堆内存分析利器》 在Java开发中,内存管理是至关重要的环节,良好的内存管理能够优化应用性能,防止内存泄漏,提升系统稳定性。MemoryAnalyzer(MAT)是一款强大的JVM堆内存分析工具...
《深入理解MemoryAnalyzer:JVM内存分析利器》 在Java应用程序的开发和优化过程中,内存管理是一项至关重要的任务。MemoryAnalyzer(MAT)是一款强大的JVM内存分析工具,它能够帮助开发者深入洞察应用的内存占用...
- **对象创建优化**:减少对象创建,复用对象,例如使用StringBuilder代替String进行字符串拼接。 - **内存分配策略**:根据对象生命周期调整新生代和老年代的比例,避免Full GC频繁发生。 - **类加载机制优化**...
标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...
Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm...
通过具体案例,如系统频繁FullGC、String.intern的使用等,可以更加深入理解JVM的运行机制和性能调优方法。 #### 结语 以上是对《JVM必知必会》中涉及的核心知识点的详细梳理。这些内容可以作为学习Java虚拟机的...
MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的Java虚拟机(JVM)内存分析工具,尤其适用于Mac OS X平台。这款工具可以帮助开发者诊断和解决Java应用中的内存泄漏问题,提高应用性能。MAT通过深入分析堆转储...
《深入理解JVM实战篇-String类》 在Java编程中,String类是使用最频繁的类之一,它涉及到许多底层机制,特别是与JVM(Java虚拟机)的交互。本文将探讨String类的一些关键特性,包括字面量与运行时常量池、String的...
Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的启动过程及其基本原理。 首先,我们需要理解JVM的基本概念。JVM是Java Virtual Machine的缩写,它是...
"JVM指令手册详细完整版.pdf" 本资源是关于JVM指令的详细手册,涵盖了JVM指令的各种系列命令,包括未归类系列、const系列、push系列、ldc系列、load系列等。每个系列命令都有其特定的功能和用途,下面我们将逐一...
在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...
### JVM 详细介绍:掌握 JVM 的各个组成部分与功能 #### 一、Java 源文件编译及执行 Java 应用程序的核心在于源文件的编译与执行。不同于 C/C++ 这类需要针对不同平台进行编译的语言,Java 采用了一种更为灵活的...
### JVM基础知识精讲 #### 一、JVM概述与HotSpot简介 Java虚拟机(JVM)是Java技术的核心组成部分之一,它为Java程序提供了运行时环境。本节将详细介绍JVM的基本概念及其核心技术——HotSpot。 **HotSpot VM** 是...
MemoryAnalyzer,即MAT(Memory Analyzer Tool),是一款由Eclipse基金会开发的强大的Java内存分析工具,尤其适用于IBM JVM(openj9)上的heap dump文件分析。本文将详细介绍MemoryAnalyzer的特性和功能,以及如何...
SAP JVM 8.1 64位是一个专为SAP系统设计的Java虚拟机,它基于Oracle的Java Development Kit (JDK) 进行优化,以满足SAP应用程序的特定需求。SAP JVM旨在提高性能、可靠性和安全性,同时确保与SAP产品的无缝集成。...