Java中String内存分析

一句话概括:

基本类型的变量数据和对象的引用都是放在栈里面的,对象本身放在堆里面,显式的String常量放在常量池,String对象放在堆中。

常量池说明:

它是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间。常量池之前是放在方法区里面的,也就是在永久代里面的,从JDK7开始移到了堆里面。

代码分析:

        String explicitS1 = "abc";
//      执行后就在常量池中创建了一个值为abc的String对象并将栈中的引用指向常量池中的对象

        String explicitS2 = "abc";
//      常量池中存在值为abc的String对象了,直接将栈中的引用指向常量池中的对象

        String objectS1 = new String("ABC");
//      Class被加载时就在常量池中创建了一个值为ABC的String对象,执行时会在堆里创建new String("ABC")对象并将栈中的引用指向堆中的对象
  
        String objectS2 = new String("ABC");
//      常量池中存在值为ABC的对象,直接在堆里创建new String("ABC")对象并将栈中的引用指向堆中的对象

内存分析:

猜你喜欢

转载自blog.csdn.net/qq_41630866/article/details/87915501