Jvm内存区域划分

Zx9r54GIFuwfGXsa-B201DUS7B9SU7bEdZdiAYcGbuY

新建对象流程

png

Java程序是如何运行起来的

png

对象的内存布局

image-20220123222325368

jdk6与jdk7的不同

1
2
3
4
5
6
7
8
class Test {
public static void main(String[] args) {
String str1 = new StringBuilder("hello").append("world").toString();
System.out.println(str1.intern() == str1) // false
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2) // true sun.misc.Version
}
}
1
intern() 去查看当前字符串常量池里面是否有这个字符串的变量引用,如果有直接返回

在以上代码中,如果在jdk6的情况下,会得到两个false,在jdk6中intern()方法会把首次遇到的字符串实例复制到永久代的字符串常量池中,返回的是常量池中的引用,但是StringBuilder是在堆里面,在jdk7中,会返回一个true和false,因为在jdk7中字符串常量池已经移动到了堆里面,StringBuilder返回的和常量池中的引用是同一个,第二个是true是因为java这个字符串在sun.misc.Version已经被加载到了jvm中。