我有一大堆类需要调整,以提高内存使用率,以换取CPU时间,我用junit 3作为测试框架来证明这一点。
虽然我可以很容易地做到这一点(使用string.getBytes("UTF-8");在一个字节中填充多个布尔值,使用long而不是Date,实现我自己的收集,等等),但我真的没有可靠的方法来显示我提交代码时的改进,因为垃圾收集器的不可预测性质。
当我谈到垃圾收集时,我的意思是我已经做了这两件事:调用System.gc(),并尝试分配一个像long[] longs=new long[Integer.MAX_VALUE];这样的数组。这是我尝试实现的一些算法,但没有成功:
1:
A:垃圾回收;
B:获取当前使用的内存量;(long beforeold=Runtime.getRuntime().maxMemory - Runtime.getRuntime().freeMemory(); )
C:分配我的旧类的数万个实例的数组;
D:垃圾收集;
f:long afterold=Runtime.getRuntime().maxMemory - Runtime.getRuntime().freeMemory();
G:重复实例化新类的过程
H:比较内存中的差异。
我得到的结果非常奇怪:我的"afterold“小于我的"beforeold”,这表明在为新类分配内存时发生了某种奇怪的垃圾收集事件。
新类实例使用的内存结果从负到正,在实例化过程中再次发出一些奇怪的垃圾回收信号。
现在,有没有其他人试图证明某些类比其他类更有效?这是一个非常酷的问题,但它仍然是一个问题。
Thx,你们说了算!
发布于 2012-02-10 03:36:27
Heinz Kabutz在Java newsletter时事通讯中有一些技巧:http://www.javaspecialists.eu/archive/Issue193.html:
public long calculateMemoryUsage(ObjectFactory factory) {
Object handle = factory.makeObject();
long memory = usedMemory();
handle = null;
lotsOfGC();
memory = usedMemory();
handle = factory.makeObject();
lotsOfGC();
return usedMemory() - memory;
}
private long usedMemory() {
return Runtime.getRuntime().totalMemory() -
Runtime.getRuntime().freeMemory();
}
private void lotsOfGC() {
for (int i = 0; i < 20; i++) {
System.gc();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
public void showMemoryUsage(ObjectFactory factory) {
long mem = calculateMemoryUsage(factory);
System.out.println(
factory.getClass().getSimpleName() + " produced " +
factory.makeObject().getClass().getSimpleName() +
" which took " + mem + " bytes");
}https://stackoverflow.com/questions/9217380
复制相似问题