String对象内存分析
2023-09-11 14:20:27 时间
Java中内存分析:
栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)。
堆(heap):存放所有new出来的对象。
常量池(constant pool):在堆中分配出来的一块存储区域,存放储显式的String常量和基本类型常量(float、int等)。另外,可以存储不经常改变的东西(public static final)。常量池中的数据可以共享。
静态存储:存放静态成员(static定义的)。
1)
String a = "abc";① String b = "abc";②
分析:
①代码执行后在常量池(constant pool)中创建了一个值为abc的String对象。
②执行时,因为常量池中存在"abc"所以就不再创建新的String对象了。
2)
String c = new String("xyz");① String d = new String("xyz");②
分析:
①Class被加载时,"xyz"被作为常量读入,在常量池(constant pool)里创建了一个共享的值为"xyz"的String对象;然后当调用到new String("xyz")的时候,会在堆(heap)里创建这个new String("xyz")对象;
②由于常量池(constant pool)中存在"xyz"所以不再创建"xyz",然后创建新的new String("xyz")。
3)
String s1 = new String("xyz"); //创建二个对象(常量池和堆中),一个引用 String s2 = new String("xyz"); //创建一个对象(堆中),并且以后每执行一次创建一个对象,一个引用 String s3 = "xyz"; //创建一个对象(常量池中),一个引用 String s4 = "xyz"; //不创建对象(共享上次常量池中的数据),只是创建一个新的引用
4)
1 public class TestStr { 2 public static void main(String[] args) { 3 // 以下两条语句创建了1个对象。"凤山"存储在字符串常量池中 4 String str1 = "凤山"; 5 String str2 = "凤山"; 6 System.out.println(str1==str2);//true 7 8 //以下两条语句创建了3个对象。"天峨",存储在字符串常量池中,两个new String()对象存储在堆内存中 9 String str3 = new String("天峨"); 10 String str4 = new String("天峨"); 11 System.out.println(str3==str4);//false 12 13 //以下两条语句创建了1个对象。9是存储在栈内存中 14 int i = 9; 15 int j = 9; 16 System.out.println(i==j);//true 17 18 //由于没有了装箱,以下两条语句创建了2个对象。两个1对象存储在堆内存中 19 Integer l1 = new Integer(1); 20 Integer k1 = new Integer(1); 21 System.out.println(l1==k1);//false 22 //以下两条语句创建了1个对象。1对象存储在栈内存中。自动装箱时对于值从127之间的值,使用一个实例。 23 Integer l = 20;//装箱 24 Integer k = 20;//装箱 25 System.out.println(l==k);//true 26 //以下两条语句创建了2个对象。i1,i2变量存储在栈内存中,两个256对象存储在堆内存中 27 Integer i1 = 256; 28 Integer i2 = 256; 29 System.out.println(i1==i2);//false 30 } 31 }
相关文章
- C++ 构造函数_内存分区_对象初始化
- MM32F3277 MicroPython的 mem 函数对于MCU内存访问
- 【转】JVM内存结构 VS Java内存模型 VS Java对象模型
- (转)linux下查看主板内存槽与内存信息
- (转)服务器UDIMM、LRDIMM、RDIMM三种内存的区别
- 23 面向对象编程 对象的内存分析 小结
- 什么变量在堆内存里存放,什么变量在栈内存里存放
- 《Python高性能编程》——2.9 用memory_profiler诊断内存的用量
- 《深入解析Android 虚拟机》——2.5 内存异常和垃圾处理
- Swift内存所有权宣言
- 编译器最重要的工作就是确定对象内存模型
- Objective-C类成员变量深度剖析--oc对象内存模型
- 待解决问题:c++栈对象的析构、虚拟内存与内存管理的关系、内存管理的解决方案。
- block没那么难(三):block和对象的内存管理
- char和QChar(Unicode的编码与内存里的值还不是一回事)
- 《低功耗蓝牙开发权威指南》——2.3节昂贵的内存
- javascript innerHTML 大数据量加载 导致IE 内存溢出 的解决办法
- jdk源码剖析二: 对象内存布局、synchronized终极原理
- [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
- JavaScript 是如何工作的:JavaScript 的内存模型
- 危险代码:如何使用Unsafe操作内存中的Java类和对象
- JVM学习--内存分配策略(持续更新)
- gpu利用率低&&超过cuda内存