Java堆硬盘

Fra*_*ife 5 java memory heap

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

Point p = new Point(25,30);
histogram[25][30] = p;
Run Code Online (Sandbox Code Playgroud)

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

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

在尝试优化内存和时间之后,我得出的结论是我真的受到RAM的限制.这就是我想要改变的地方.我知道-Xmx开关(设置为10GB).有没有办法使用Windows的虚拟内存来存储栅格和/或阵列?我很清楚这将导致显着的性能损失,但是代替降低质量,似乎没有多少选择.

Sea*_*wen 3

操作系统已经将硬盘空间转化为 RAM 供您和每个进程使用——当然不需要魔法。这将比您想象的更加严重的性能灾难;它会很慢,以至于实际上无法工作。

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

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

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

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

也尝试-XX:+UseCompressedOops减少对象开销。还可以尝试-XX:NewRatio=20或更高的方式让 JVM 为长寿命对象保留几乎所有堆。这实际上可以让你使用更多的堆。