Java堆硬盘驱动器

Java堆硬盘驱动器,java,memory,heap,Java,Memory,Heap,我已经在一个Java程序上工作了很长一段时间,这个程序可以生成分形轨道。就像照片一样,图像越大,缩小后效果越好。该程序使用二维对象(点)数组,该数组在计算点的值时写入。也就是说,该点存储在其对应的值中,即: Point p = new Point(25,30); histogram[25][30] = p; 当然,这是为了简单而编辑的。我可以将点值写入CSV,然后将其应用于光栅,但使用类似的方法会产生不希望的结果。我尝试了相当长的一段时间,因为我喜欢在没有这个阵列的情况下,能够利用释放的空间制

我已经在一个Java程序上工作了很长一段时间,这个程序可以生成分形轨道。就像照片一样,图像越大,缩小后效果越好。该程序使用二维对象(点)数组,该数组在计算点的值时写入。也就是说,该点存储在其对应的值中,即:

Point p = new Point(25,30);
histogram[25][30] = p;
当然,这是为了简单而编辑的。我可以将点值写入CSV,然后将其应用于光栅,但使用类似的方法会产生不希望的结果。我尝试了相当长的一段时间,因为我喜欢在没有这个阵列的情况下,能够利用释放的空间制作更大的图像。这就是行不通。为了清楚起见,我想补充一点,点对象也存储颜色数据

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


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

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


操作系统已经在为您和每一个进程将硬盘空间变成RAM——当然,不需要魔法。这将比你想象的更像是一场性能灾难;这将是如此缓慢,以至于有效地无法工作

您正在查找内存映射文件吗?

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

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

<>而不是在内存中放置<代码> Realabraster < /Cord>,考虑直接以简单的图像格式直接写入图像文件。BMP可以非常简单。然后可能使用一个外部工具来有效地转换它


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

我想您应该看看,尤其是POJO的基于注释的持久性。我在示例中没有显示它,但Point对象还包含颜色数据。我想放弃Point类而不是更小的类;然而,至少有三个(最大的)类需要几乎完全重写。一开始的设计选择很差。如果我重新编写程序,我将解决这个问题。你知道一种直接写入JPEG的方法吗?摆脱光栅将是天赐良机。如果没有,我会写信给BMP。使用JPEG的唯一原因是,在我尝试过的许多方法中,最好的海量图像大小调整器只接受JPEG文件。