我一直在研究一个Java程序,它现在生成分形轨道已有一段时间了。就像照片一样,图像越大,按比例缩小就越好。该程序使用2D对象(Point)数组,该数组在计算点的值时写入。也就是说Point存储在它的相应值中,即:
Point p = new Point(25,30);
histogram[25][30] = p;
当然,这是为了简单起见而编辑的。我可以将点值写入CSV,然后将它们应用于栅格,但使用类似的方法会产生不良结果。我尝试了很长一段时间,因为我喜欢能够通过没有这个阵列释放空间来制作更大的图像。它不会起作用。为清楚起见,我想补充一点,Point对象也存储颜色数据。
下一个问题是WriteableRaster,它与数组具有相同的尺寸。两者相结合占用了大量的内存。在尝试多次改变它的方式后,我接受了这个,每个都有较低质量的结果。
在尝试优化内存和时间之后,我得出的结论是我真的受到RAM的限制。这就是我想要改变的地方。我知道-Xmx开关(设置为10GB)。有没有办法使用Windows的虚拟内存来存储栅格和/或阵列?我很清楚这会造成重大的性能损失,但是代替降低质量,似乎没有多少选择。
答案 0 :(得分:2)
操作系统已经为您和每个进程创建了硬盘空间 - 无需魔法。这将是一场比您想象的更多的性能灾难;它会慢到无法有效地工作。
您在寻找内存映射文件吗? http://docs.oracle.com/javase/6/docs/api/java/nio/MappedByteBuffer.html
如果真的要在内存中完成,我敢打赌,通过一些优化,你可以大大降低你的内存使用量。例如,您的Point
对象主要是开销,而不是数据。计算引用所需的字节数,然后计算Object
开销,与两个ints
进行比较。
对于x和y坐标,您可以使用两个大的并行int
数组减少开销。当然,您必须将其封装在代码中才能访问。但它可以减少这个数据结构的内存使用量。减少数百万个对象也可以加速GC运行。
不要将WritableRaster
放在内存中,而是考虑直接用自己的简单图像格式写出图像文件。 BMP可以非常简单。然后可能使用外部工具来有效地转换它。
尝试-XX:+UseCompressedOops
以减少对象开销。还可以尝试使用-XX:NewRatio=20
或更高版本来使JVM为长期存在的对象保留几乎所有堆。这实际上可以让你使用更多的堆。
答案 1 :(得分:0)
建议不要配置JVM内存参数(Xmx),以使操作系统从其交换内存中分配。显然垃圾收集机制需要随机访问堆内存,如果没有,程序将会长时间抖动并可能锁定。请检查我的问题(最后一段)已经给出的答案: