关于Java中内存结构
来源:互联网 发布:windows loader v3.27 编辑:程序博客网 时间:2024/05/02 04:25
栈:对象引用以及一些基本类型变量数据(用完自动释放所占用的内存)
堆:对象以及数组(当没有引用指向它时,由垃圾回收机制回收,不一定立即被回收),存在栈中的数据可以共享(多个引用可以同时独立的指向一个数据)
常量池:常量池指的是在编译期被确定,并被保存在已编译的.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中HashMap结构以及内存相关
- Java中运行时内存结构补充
- java中内存结构及堆栈详解
- Java中运行时内存结构
- java中OutofMemoryError和JVM内存结构
- 关于Windows内存结构
- 关于结构体中含有指针时候的内存分配
- 关于Java中String内存的学习
- 关于JAVA中内存溢出的解决办法
- 关于JAVA中内存溢出的解决办法
- 关于Java中内存溢出的解决办法
- 关于java中String 的内存解析
- 关于JAVA中内存溢出的解决办法
- 关于JAVA中内存溢出的解决办法
- 关于JAVA中内存溢出的解决办法
- 关于JAVA中内存溢出的解决办法
- LoadRunner教程08:HTML和URL比较
- leetcode-53 Maximum Subarray
- 关于 PCRE_UTF8 support 问题
- 习大大重要讲话概要
- 试用zip构造字典
- 关于Java中内存结构
- MySQL新建用户,授权,删除用户,修改密码,远程登陆,亲测可行
- 单点登录之CAS SSO从入门到精通(第三天)
- 跳过Mysql验证
- 二叉查找树
- getline() demo
- android LayoutInflater.inflate()的参数及其用法
- 队列用法示例:解密QQ号
- 1059. Prime Factors