0

A类:

private String name;
private double[] data;
private double[] data1;
private double[] data2;
private double[] data3;
private double[] data4;

public A() (String name, double[] data, double[] data1... double[] data4) {
    this.name = name;
    this.data = data;
    ....
    this.data4= data4;
}

And getter methods...

B类:

class B
String[] names = {"1", "2", "3", "4", "5", ... "20"};
Map<String, Report> types;

static {

    for(String name : names) {
        types.put(name, new A(name, getRandomData(), getRandomData(), getRandomData(), name.getData3(), name.getData4()))
    }
}

public static Collection<A> getDatas() {
    Collection<A> originals = types.values();
    List<A> result = new ArrayList<>();

    for (A original: originals) {
        A data = (new A(original.getData(),
                original.getDat1(),
                original.getData2().clone(),
                original.getData3().clone(),
                original.getData4().clone()));

        result.add(data);

    return result;
}

private static double[] getRandomData() {

    double[] result = new double[500000];
    Random random = new Random();

    for (int i = 0; i < result.length; i++) {
        result[i] = random.nextDouble();
    }

    return result;
}

我无法更改 B 类中的任何内容,但我可以修改 A 类并添加额外的类。

我已经实现了享元模式,但它通常会阻止内存使用量增长,而不是实际上减少 RAM 使用量。

我知道巨大的 RAM 使用来自 getRandomData() 方法,它为每个 double[] 数组创建 double[500000] 随机元素,但 B 类中的所有内容都需要保留。

如果我删除 clone(),它会直接将 RAM 使用量从 800~MB 减少到 400~MB,但我也无法更改这个。我问了解决这个问题的学生,他们通常使用 .clone(),有人告诉我为享元模式缓存 .clone(),但是没有办法 declone() 克隆的数组不是吗?

那么有人可以告诉我如何在 FlyweightFactory 类中缓存克隆吗?我花了几个小时来解决这个问题,但我仍然在为这个问题而苦苦挣扎......

4

0 回答 0