关于Java中内存结构
2015-03-06 20:06
211 查看
栈:对象引用以及一些基本类型变量数据(用完自动释放所占用的内存)
堆:对象以及数组(当没有引用指向它时,由垃圾回收机制回收,不一定立即被回收),存在栈中的数据可以共享(多个引用可以同时独立的指向一个数据)
常量池:常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用。
String str = new String("abc");
(str是指向new String("abc"))
String str = "abc"; (str是指向"abc")
String str = new String("abc"); (分配了三个内存空间:为引用str分配内存空间保存在栈中,为new String("abc")分配内存空间保存在堆中,为"abc"分配内存空间保存我也不知道)
String str = "abc"; 两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。而第二种是先在栈中创建一个对String类的对象引用变量str,然后通过符号引用去字符串常量池 里找有没有"abc",如果没有,则将"abc"存放进字符串常量池 ,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
注:我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。
String a = "ab";
String bb = "b";
String b = "a" + bb;
System.out.println((a == b)); //result = false 分析:JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a" + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。所以上面程序的结果也就为false。(a和b指向的地址不一样)
堆:对象以及数组(当没有引用指向它时,由垃圾回收机制回收,不一定立即被回收),存在栈中的数据可以共享(多个引用可以同时独立的指向一个数据)
常量池:常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用。
String str = new String("abc");
(str是指向new String("abc"))
String str = "abc"; (str是指向"abc")
String str = new String("abc"); (分配了三个内存空间:为引用str分配内存空间保存在栈中,为new String("abc")分配内存空间保存在堆中,为"abc"分配内存空间保存我也不知道)
String str = "abc"; 两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。而第二种是先在栈中创建一个对String类的对象引用变量str,然后通过符号引用去字符串常量池 里找有没有"abc",如果没有,则将"abc"存放进字符串常量池 ,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
注:我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。
String a = "ab";
String bb = "b";
String b = "a" + bb;
System.out.println((a == b)); //result = false 分析:JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a" + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。所以上面程序的结果也就为false。(a和b指向的地址不一样)
相关文章推荐
- 关于Java中多维数组的内存结构分析
- 关于Java虚拟机二三事(一)---Java技术体系及JVM内存结构
- 关于Java占用内存的研究
- 关于Java占用内存的研究
- Java虚假机jvm关于内存的设置与调优
- JVM学习笔记(1、 基本结构;2、Java代码编译和执行的整个过程3、内存管理和垃圾回收 4、 内存调优 )
- 关于Java虚拟机内存的使用
- 关于java的内存泄露
- 关于java内存的理解
- java中HashMap结构以及内存相关
- C/C++中关于地址、指针和引用变量的学习笔记(九) : 内存结构
- 关于Windows内存结构方面做点笔记
- 关于JAVA内存泄漏问题注意事项
- 关于Java占用内存的研究
- 在AIX上用IBM的JVM,内存溢出时默认地会产生javacore文件(关于cpu的)和heapdump文件(关于内存的)。手动产生堆栈文件的方法是使用kill -3
- JVM学习笔记(1、 基本结构;2、Java代码编译和执行的整个过程3、内存管理和垃圾回收 4、 内存调优 )
- 关于Java占用内存的研究
- 讨论关于Java占用内存的研究
- 关于java内存不足异常的处理.
- 【初学java】关于java程序的结构