为什么啊???to gtlang78() : 我查了一下:public long totalMemory(),Returns: the total amount of memory currently available for current and future objects, measured in bytes.我的E文一斑斑,对上面我是这样理解的: 就是这个个方法返回的当前可用的MEMORY 如果是这样的话,应该是m1>m2啊 可是我在计算机运行 发现 结果却是m1<m2 为什么啊???
HOHO. no, 我简直对你说的"引用变量"词太不敏感了,我贴的那是关于对象的大小的。HOHO,sorry。你引用变量你是专指ref吗?就是4个字节。这个有官方的文档。但是并不是每个primitive都是4个字节,如long就不是4个字节。但如果你说的是引用变量就是ref的话,那绝对4个字节。就连byte也是4个字节.HOHO,从没用过 引用变量 这个词。regards
for common 32-bit JVMs a plain java.lang.Object takes up 8 bytes,and,the object_ref_size is 4 bytes.恩,是的,而且不同的object有不同的分配标准。这个有详细的Specification的。是些类似公式的东西。
overhead about 8 bytes per object object reference 4, or 8 bytes in a 64-bit system return address 4 http://mindprod.com/jgloss/sizeof.html
Sizeof for JavaThe sizeof operator is not available in Java, but sometimes you may want to know the size of Java objects. The size of an object depends on the number of header words in an object, pointer size (32/64 bit), and alignment variations that make object size dependent on VM implementation. With JDK 5.0, you can get size in two new ways without using profilers or native agents: Use java.lang.instrument.Instrument.getObjectSize API.Use jmap -histo to get object histogram. For each class, jmap prints number of objects and total size in bytes occupied by those objects. Divide total size by number of objects to get size of an individual object.
public static void main(String[] args) {
long m1 = Runtime.getRuntime().totalMemory();
Object[] objArray = new Object[1024 * 1024 * 10];
long m2 = Runtime.getRuntime().totalMemory();
System.out.println(m2);
System.out.println(m2 - m1);
System.out.println((double)(m2 - m1) / (1024 * 1024 * 10));
}
}
瓦散,是你啊。^_^
老师好,你可还记得你的学生我?刚毕业的。
谢谢你的测试代码,记不记得那边书讲过这个咚咚?To oosky2004(oosky)
你好,工作顺利吧。我们到其他地方聊。
我查了一下:public long totalMemory(),Returns:
the total amount of memory currently available for current and future objects, measured in bytes.我的E文一斑斑,对上面我是这样理解的:
就是这个个方法返回的当前可用的MEMORY
如果是这样的话,应该是m1>m2啊
可是我在计算机运行 发现
结果却是m1<m2
为什么啊???
Object[] objArray = new Object[1024 * 1024 * 10];
System.out.println((double)(m2 - m1) / (1024 * 1024 * 10));
我将1024 * 1024 * 10改为10或者100
结果却是:
m1=2031616
m2=2031616 //怎么等于M1????
m1 - m2=0
(double)(m2 - m1) / (1024 * 1024 * 10)=0.0 //????怎么会是0
void a()
{
System.out.println(Runtime.getRuntime().freeMemory());
Object a=null;
System.out.println(Runtime.getRuntime().freeMemory());
int i=0;
System.out.println(Runtime.getRuntime().freeMemory());
}
而JVM也是32位了,一般就是地址数据位.
"引用变量就是4个字节。这个有官方的文档。"那里啊?有没有那本书页码?我粗略查了JLS、JVM Specification都没有看见有关说明。
不记得在那里看见过。
gtlang78() 说的对,32位的jvm,好像是4个字节。引用变量、句柄、对象变量,多态变量、也有人直接用"引用"称呼它,我一般最喜欢用的是句柄,Gosling的《Java编程语言》中把它称为“reference variable”(引用变量),而Bruce Eckel在Thinking in Java 2e中由handle改为 references,个人认为,这是TIJ中少数几个败笔之一。
呵呵,句柄、引用与对象,三个相关的术语,三个不同的东西。
for common 32-bit JVMs a plain java.lang.Object takes up 8 bytes,and,the object_ref_size is 4 bytes.
呵呵,不记得出处了,晕
基本上是c/c++中的概念,而且java也并不需要句柄的概念
因为java不直接操作内存,哪里来的句柄?
句柄这个概念,呵呵,是的,令人想起c/c++。我之所以使用它:
1、TIJ 1e 使用了它。而2e使用了reference。我说这是TIJ中少数几个败笔之一,正因为Bruce Eckel把reference与reference variable有意/无意地混淆起来,(不仅仅指其字眼上的错误)。
2、希望强调:句柄、引用与对象是三个相关的术语,三个不同的东西。
3、这个句柄,我说,“Handle直观地看就是手柄、把手,我们采用计算机界常用的中文翻译句柄。没有必要了解句柄以前的含义,这不重要。也不介意把所有的句柄替换成把手,这不重要。重要的是,Handle是一个学习本章时非常需要的术语。”呵呵很多人都说“句柄”不好,现在我常常用引用变量或多态变量。
BTW:String str =new String("");
str 是引用变量,
引用是表达式new String("")的值、是一个字面值/文字
对象是??对象1#。呵呵,不好说,常常说new String("")创建的“该”对象。
不过,我胆小,怕老虎
object reference 4, or 8 bytes in a 64-bit system
return address 4
http://mindprod.com/jgloss/sizeof.html