现在的位置: 首页 > 综合 > 正文

Java中内存管理

2017年12月08日 ⁄ 综合 ⁄ 共 524字 ⁄ 字号 评论关闭

对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");方式创建时,则不管字符串内容相不相同都会单独分配内存。这里不再证明。

以上的结论均可对照下图理解:

抱歉!评论已关闭.