如:局部变量String str = “aaaaaa”;
这句话应该需要在堆和栈中各开辟一段空间,
1. “aaaaaa”保存在栈中
2. str这个引用变量保存在堆中,保存的是“aaaaaa”在栈中的内存地址题目的意思是str在堆中所占用的大小,我答的是4个字节(window 32位操作系统,所以是4字节),结果看到个红X。
有点想不通,求解
这句话应该需要在堆和栈中各开辟一段空间,
1. “aaaaaa”保存在栈中
2. str这个引用变量保存在堆中,保存的是“aaaaaa”在栈中的内存地址题目的意思是str在堆中所占用的大小,我答的是4个字节(window 32位操作系统,所以是4字节),结果看到个红X。
有点想不通,求解
是否需要分开回答呢? window下是多少,linux下是多少呢?想不明
2. str这个引用变量保存在堆中,保存的是“aaaaaa”在栈中的内存地址
是不是搞错了,str这个引用变量保存在堆中????应该是:str 引用是压入栈中操作,相当于对象的内存中另一种标识,在堆中开辟空间存“aaaaaa”,操作的时候根栈中的引用找到堆中的对象,堆是存储的单位,栈是运行时的单位。
java class文件跟操作系统有关系吗?
"aaaaaa"在堆
str这个 '引用' 在栈区
2. str这个引用变量保存在栈中,保存的是“aaaaaa”在堆中的内存地址
str在栈中占用一个整型大小的空间,为“aaaaaa”的hashcode.
#include <iostream.h>
#include <string>
using namespace std;
int main()
{
string str;
str = "aaaaaa";
cout<<sizeof(string)<<endl;
cout<<sizeof(str)<<endl;
cout<<sizeof("aaaaaa");
return 0;
}
结果:
16
16
7
不知有没有参考意义?
(2)与String str=new String("aaaa") 是有区别的。(1)在编译时在程序的数据区分配内存,做为常量使用,也就是说str中存的就是“aaaa”,而不是地址。
(2)在运行时在堆中分配内在。1个字符占两个字节,(1)占8个;
(2)存有是地址,占几个字节,只有虚拟机知道
那是不是用这个类。MemoryUsagepublic class B {
public B() {
String s = "aaaaaa";
// 注视掉:NonHead_Use:13089776 byte 没注释为:NonHead_Use:13089840 byte
} public static void main(String[] args) throws Exception {
MemoryMXBean mmxb = ManagementFactory.getMemoryMXBean();
MemoryUsage nonHead = mmxb.getNonHeapMemoryUsage();
System.out.println("NonHead_Use:" + nonHead.getUsed()); }
}不知道这可以不?
别笑我。