- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
考虑以下两段 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中的原始数据类型?
这里已经发布了一个与此有点相似的问题,但没有这样的场景。
最佳答案
我不会关注 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/
我有使用 namespace 的代码,其中有一些,我的大脑有些困惑。 如果我有类似的东西: #include protected: vector mRegistryList; 编译器提示 v
是否有好的算法/分词器/正则表达式或其他一些技术可以检测用户输入的英语句子的哪一部分是“谁”、“什么”、“何时”和“哪里”? 理想情况下,它可以在 Elasticsearch 或 javascript
我因使用 uint 而不是 size_t 而受到很多批评,但每次我检查我正在使用的工具链时都会发现 size_t 被定义为一个 uint。 是否有任何编译器实现中 size_t 实际上不是 uint?
在使用 MongoDB 的应用程序中,何时/何地是进行关系数据库中迁移的数据库更改的最佳位置? 比如创建索引或者设置shard key应该如何管理?这段代码应该去哪里? 最佳答案 最好有意识地在 sh
我是一名优秀的程序员,十分优秀!