加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在Java中使用原始数据类型的位置和时间是否合适?

发布时间:2020-12-14 19:16:35 所属栏目:Java 来源:网络整理
导读:考虑Java中的以下两段代码, Integer x=new Integer(100);Integer y=x;Integer z=x;System.out.println("Used memory (bytes): " + (Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory())); 在我的系统上测试时的内存使用情况:使用的内存

考虑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()));

在上述两种情况下,在我的系统上测试时内存使用情况完全相同:使用的内存(字节):287872

该声明

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

将显示当前正在使用的总内存[可用内存总量 – 当前可用内存],(以字节为单位).

我已经通过上述方法验证了在第一种情况下,内存使用(287848)低于第二种(287872),而在其余两种情况下,它完全相同(287872).当然,显然,它应该是这样的,因为在第一种情况下,y和z包含x中保存的引用的副本,并且它们的所有(x,y和z)指向相同/共同的对象(位置)意味着第一种情况比第二种情况更好,更合适,在这两种情况的其余情况下,存在具有完全相同的内存使用情况的等效语句(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();
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读