对Java虚拟机JVM的内存管理理解。
JVM中的内存分为三块,分别为栈区、堆区和代码区/静态数据区。
当正常定义变量时,JVM会在栈区为变量分配内存。如图:
当实例化一个对象时,JVM在栈区给引用分配一个内存,而在堆区给实例化的对象分配内存。如图:
当没有实例化对象时,JVm会给某个类里的代码分配内存,这部分内存在代码区。如图:
当定义定义静态变量时,JVM给这些变量分配的内存在静态数据区,如图:
对于字符串,在堆区有个字符池。创建字符串时一般有两种方式分别为:
当以第一种方式创建时,如果该字符串是第一次创建,则JVM在字符池中给s1分配内存,s1指向“abc”,当再次创建时(“abc”),JVM发现已经有一个“abc”,JVM不会再为s2的“abc”单独分配内存,而是将s2指向是s1的“abc”,可以证明,如下:
且有这种情况:
可见JVM还是相当“聪明”的。
但是,当第二种情况写成这种形式就得单独给“abc”分配堆区内存:String s2 = “abc”; s2 = s2 + “d”;大家可以看出差别。
当用String s = new String("abc");方式创建时,则不管字符串内容相不相同都会单独分配内存。这里不再证明。
以上的结论均可对照下图理解: