5

很长一段时间以来,我一直在研究一个生成分形轨道的 Java 程序。就像照片一样,图像越大,按比例缩小时效果就越好。该程序使用 2D 对象 (Point) 数组,在计算点的值时写入该数组。也就是说Point存储在它的对应值中,即:

Point p = new Point(25,30);
histogram[25][30] = p;

当然,为了简单起见,对此进行了编辑。我可以将点值写入 CSV,然后将它们应用于栅格,但使用类似方法会产生不良结果。我尝试了很长一段时间,因为我喜欢能够通过没有这个数组释放的空间制作更大的图像。它只是行不通。为清楚起见,我想补充一点,Point 对象还存储颜色数据。

下一个问题是 WriteableRaster,它将具有与数组相同的维度。两者结合起来占用了大量的内存。我已经接受了这一点,在尝试多次改变它的方式后,每次都得到较低质量的结果。

在尝试优化内存和时间之后,我得出的结论是我真的受到 RAM 的限制。这就是我想要改变的。我知道 -Xmx 开关(设置为 10GB)。有没有办法使用 Windows 的虚拟内存来存储光栅和/或数组?我很清楚这将导致对性能的重大影响,但是代替降低质量,似乎确实没有太多选择。

4

2 回答 2

3

操作系统已经为你和每个进程将硬盘空间变成了 RAM——不需要任何魔法。这将比您想象的更加严重。它会很慢,以至于无法有效地工作。

您在寻找内存映射文件吗? http://docs.oracle.com/javase/6/docs/api/java/nio/MappedByteBuffer.html

如果这真的要在内存中完成,我敢打赌,您可以通过一些优化来显着降低内存使用量。例如,您的Point对象主要是开销而不是数据。计算引用所需的字节数,然后计算Object开销,与两个相比ints

int对于 x 和 y 坐标,您可以使用两个大的平行数组将开销减少到零。当然,您必须将其封装起来才能在您的代码中访问。但它可以将这个数据结构的内存使用量减半。减少数百万个对象也加快了 GC 运行速度。

与其将 aWritableRaster放入内存,不如考虑自己直接以某种简单的图像格式写出图像文件。BMP 可以非常简单。然后也许使用外部工具来有效地转换它。

尝试-XX:+UseCompressedOops减少对象开销。还可以尝试-XX:NewRatio=20或更高,以使 JVM 将几乎所有的堆都保留给长生命周期的对象。这实际上可以让你使用更多的堆。

于 2012-12-12T09:47:23.863 回答
0

不建议配置您的 JVM 内存参数 (Xmx) 以使操作系统从其交换内存中分配。显然,垃圾收集机制需要对堆内存进行随机访问,如果没有,程序将长时间颠簸并可能锁定。请检查我的问题已经给出的答案(最后一段):

-Xmx 的大价值会推迟垃圾收集吗

于 2012-12-12T09:38:29.023 回答