带有空列的结果集中的Java Bean是否会显着影响内存/大小?

时间:2016-05-27 16:25:49

标签: java

这听起来可能是一个愚蠢的问题,但我找不到很多关于此事的内容(除了这篇文章:https://plumbr.eu/blog/memory-leaks/reducing-memory-consumption-by-20x)。

问题是:我们要查询具有20列的Oracle数据库表。我们创建了一个Java bean,它映射到所有20列。现在使用Spring JDBC,我们执行一个只选择3列(20个)的查询,并且我们只设置bean中的3个属性(total properties = 20),这意味着17个属性的其余部分应为null。现在我们使用这个结果集(填充3个字段,但是17个为null)进行处理,在层之间传递等。

这是否会显着影响Java程序使用的总内存,特别是当我们要删除几百条DB记录或Java会以某种方式在内部优化它时?如果只创建一个只有3个字段的bean(我们需要将其作为查询的一部分?)

,那会更好吗?

我们正在使用JDK 1.8,Spring 4,oracle 11。

1 个答案:

答案 0 :(得分:2)

  

这是否会影响Java程序使用的总内存

简短回答 - 是的,它会。

  

值得注意的是?

嗯,这取决于“显着”是什么意思。

当创建一个类的实例时 - 它占用一些特定的空间。

所使用的内存的实际大小(对象占用空间)取决于许多因素,尤其是:

  • bean中字段的类型
    • 如果它是原语 - 每个字段都有一个特定的字节数保留see spec
    • 用于引用类型(对象及其后代) - 引用也占用4或8个字节
  • 内存对齐
  • JVM实施
  • JVM参数
  • ...

如果您将17个属性设置为null,我们可以假设您已将这些字段声明为非原始字段。因此,如果您不使用这些字段,您可能会“浪费”68或136个字节。甚至更多。问题是 - 对你来说太过分了吗?

你可以检测你拥有的实际物体并比较记忆足迹并决定它是否适合你

  

或Java会以某种方式在内部优化它

我不知道。但如果有人能够对此有所了解,那将会很好。