加载太多程序? (Java)的

时间:2017-01-05 09:31:12

标签: java serialization ram

我用Java编写了一本食谱。为此,我创建了一个Recipe-Object,其中保存了名称和菜肴图片等信息。

我将所有这些对象放入List并使用所有配方序列化List。当再次打开食谱时,所有这些食谱(每个食谱都有一张图片)再次加载到程序中。

如果有500多个食谱,那么必须将500多张照片加载到程序中。

我的问题:

  • 这些图片会保存到我电脑的RAM中吗?
  • 将每个食谱序列化为一个自己的文件会更好吗? 加载选中的配方?

1 个答案:

答案 0 :(得分:4)

这与序列化无关;至少在概念层面上。

重点是:当你的某些自定义对象O消耗X字节的数据时;然后只要该对象O在您的JVM中“活着”,那么这些X字节的数据就会在JVM中分配。

换句话说:当您直接将图像字节放入对象时;那么这些对象是通过 new 创建的,还是从某些字节流中读取,或者从 n 不同来源读取它们无关紧要。

正是因为这个原因,人们会试图不将图像字节直接“包含”到“业务”对象中。例如,将图像保存为硬盘驱动器上的文件;并且只向对象添加文件名。含义:只有当您在屏幕上实际设置“配方”时,才会从驱动器中加载图片;以便将其显示给用户。

因此,您的问题的答案是:如果从一个文件或 n 文件加载序列化对象,程序的内存消耗无关紧要。

您的内存消耗更多取决于您如何处理与您的“配方对象”有某种关联的“资源”的确切内部细节。

最后:做什么真的取决于你的要求。如果我们正在讨论一些小型java程序,这个程序应该放在一些“普通桌面”机器上;然后在你的JVM中保留500或1000个“实时”对象可能没问题;即使每个人消耗说500 KB的图片(但请注意,我们已经在这里轻松达到250 MB的RAM消耗!)。

但是,如果我们谈论在手机上运行的某些应用程序;肯定你想要浪费250 MB内存并在那里保留500个对象。

因此,在大多数情况下,合理的方法更像是:

  1. 始终在内存中保留已知食谱的列表
  2. “加载”食谱仅在它们即将被“使用”
  3. 将食谱与属于它的“资源”(例如图像)分开