0
import java.util.ArrayList;
import java.util.List;

import net.sf.ehcache.pool.sizeof.UnsafeSizeOf;

public class EhCacheTest {

    private List<Double> testList = new ArrayList<Double>();

    public static void main(String[] args) {
        EhCacheTest test = new EhCacheTest();
        for(int i=0;i<1000;i++) {
            test.addItem(1.0);
            System.out.println(new UnsafeSizeOf().sizeOf(test));
        }
    }

    public void addItem(double a) {
        testList.add(a);
    }
}

我使用 UnsafeSizeOf 来计算对象“测试”的大小。无论我在列表中添加了多少双精度,“测试”的大小始终为 16 字节。

因此,maxBytesLocalHeap 参数对我来说毫无用处。

4

1 回答 1

0

鉴于您的代码片段,这是完全可以预料的。

请参阅该方法的 javadocSizeOf.sizeOf,它清楚地说明它在导航对象图的情况下调整实例的大小。

您要使用的是SizeOf.deepSizeOf哪个将导航对象图。

SizeOf然而,这个测试是有缺陷的,因为 Ehcache 使用多个实现,这取决于特定环境中可用的内容,导致您冒着将该特定实现与另一个实现进行比较的风险。

如果您真的想确认堆上的字节大小是否有效,最好填充缓存,通过统计信息找出它报告的大小,然后进行堆转储以查看有效使用了多少内存。

于 2018-01-24T13:24:22.400 回答