gpt4 book ai didi

java - 在 Java 中何时何地使用原始数据类型是有效的?

转载 作者:搜寻专家 更新时间:2023-10-31 20:15:14 25 4
gpt4 key购买 nike

考虑以下两段 Java 代码,

Integer x=new Integer(100);
Integer y=x;
Integer z=x;


System.out.println("Used memory (bytes): " +
(Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory()));

其中内存使用是在我的系统上测试时:已用内存(字节):287848


int a=100;
int b=a;
int c=a;

System.out.println("Used memory (bytes): " +
(Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory()));

其中内存使用是在我的系统上测试时:已用内存(字节):287872



及以下内容

Integer x=new Integer(100);       
System.out.println("Used memory (bytes): " +
(Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory()));

int a=100;        
System.out.println("Used memory (bytes): " +
(Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory()));

以上两种情况,在我的系统上测试时,内存使用情况完全一样: Used memory (bytes): 287872



声明

System.out.println("Used memory (bytes): " + 
(Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory()));

会显示当前使用的总内存[Total available memory-Currently free available memory],(以字节为单位)。


我已经通过上述方法验证,在第一种情况下内存使用量(287848)低于第二种情况(287872),而在其余情况下在这两种情况中,它完全相同 (287872)。当然,显然,它应该是这样的,因为在第一种情况下,y 和 z 包含 x 中保存的引用的副本,并且它们都(x、y 和 z)指向相同/公共(public)对象(位置)意味着第一种情况比第二种情况更好更合适,在其余两种情况下,存在具有完全相同内存使用的等效语句 (287872 ) 。如果是这样,那么在 Java 中使用原始数据类型应该是无用的并且是可以避免的,尽管它们基本上是为更好的内存使用和更多的 CPU 使用而设计的。仍然为什么存在Java中的原始数据类型?


这里已经发布了一个与此有点相似的问题,但没有这样的场景。

That question is here.

最佳答案

我不会关注 Runtime.freeMemory——它非常模糊(它是否包括未使用的堆栈空间?PermGen 空间?堆对象之间的间隙太小而无法使用?),并且在不停止的情况下给出任何精确的测量所有线程都是不可能的。

整数的空间效率必然低于整数,因为仅对整数的引用 占用 32 位(对于没有压缩指针的 64 位 JVM 为 64 位)。

如果你真的想凭经验测试它,让许多线程深度递归然后等待。如

class TestThread extends Thread {
private void recurse(int depth) {
int a, b, c, d, e, f, g;
if (depth < 100)
recurse(depth + 1);
for (;;) try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {}
}

@Override public void run() {
recurse(0);
}

public static void main(String[] _) {
for (int i = 0; i < 500; ++i)
new TestThread().start();
}
}

关于java - 在 Java 中何时何地使用原始数据类型是有效的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8001988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com