在程序中加载太多? (Java)

Loading too much into the program? (Java)

我在 Java 中编写了一本食谱。为此,我创建了一个食谱对象,其中保存了菜肴的名称和图片等信息。

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

如果有500+个菜谱,那么程序中必须加载500+张图片

我的问题:

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

关键是:当你的某个自定义对象 O 消耗了 X 字节的数据时;那么只要该对象 O 在您的 JVM 中 "alive",就会在 JVM 中分配这些 X 字节的数据。

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

正是出于这个原因,人们会尽量不将 "include" 图像字节直接放入 "business" 对象中。例如,将图像作为文件保存在硬盘上;并且只向对象添加文件名。意思是:只有当你实际在屏幕上放置一个 "recipe" 时,你才会从驱动器加载图片;以便将其显示给用户。

所以你的问题的答案是:你的程序的内存消耗不关心你是从一个文件加载序列化对象,还是从n 文件。

你的内存消耗更多地取决于你如何处理 "resources" 的确切内部细节,这些细节与你的 "recipe objects"。

最后:做什么真的取决于你的要求。如果我们谈论的是某个 "average desktop" 机器上的小 java 程序;然后在 JVM 中保留 500 或 1000 "live" 个对象可能没问题;即使每个图片消耗 500 KB 的图片(但请注意,我们在这里已经轻松达到 250 MB 的 RAM 消耗!)。

但是如果我们谈论的是移动设备上的某些应用 运行 phone;您肯定不想浪费 250 MB 的内存并在那里保留 500 个对象。

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

  1. 一直在内存中保存一个已知食谱列表
  2. "Loading" 菜谱只有在即将 "used"
  3. 将食谱与属于它的"resources"(例如图片)分开