java - 如果声明但未初始化对象的变量是否会使用内存空间?

标签 java memory class-variables

我有一个类,我想使用大约十到十万个。因此,我不想不必要地浪费内存位置。

只有少数(<100)个我需要 2 个特殊变量。如果我只是声明它们,但不初始化它们,我是否需要与初始化它们相同的内存使用量?

如果是,我还有其他选择(除了将它们作为自己的类之外)来减少内存使用吗?

这是我的代码示例(名称概率我只需要几次):

public class Neuron {
    
  private String name;
  private float propability;
  private float connection[];
  private float bias;

  public Neuron(float[] connection, float bias) {
    this.connection = connection;
    this.bias = bias;
  }

  public Neuron(int propability, String name, float[] connection, float bias) {
    this.name = name;
    this.propability = propability;
    this.connection = connection;
    this.bias = bias;
  }

    //more code

}

最佳答案

我有点不同意:

private float connection[];
private float bias;

第一个(数组)是引用类型。换句话说:指向某个内存区域的(潜在)指针。 显然:只要该指针指向null(“无处”),就不需要额外内存。

但是请不要误会,您的对象本身需要适合内存。含义:当您实例化一个新的 Neuron 对象时,JVM 会请求存储 Neuron 对象所需的确切内存量。这意味着:分配了一些内存来容纳该数组引用,当然:您的 float 原始值的内存,它们都会立即分配。

该成员字段中存储的是 0、100.00 还是 10394.283 并不重要:因为 JVM 确保您有足够的内存来容纳所需的位和字节。

因此:当您确实拥有数百万个对象时,对象中的每个浮点字段都会添加 32 位。无论该字段中的值来自何处。

当然,如果您的数组稍后将保存 5、10 或 1000 个条目,那么这将占据您的大部分内存消耗。但最初,当您创建数百万个“空”Neuron 对象时,您必须为类中存在的每个字段“付费”。

含义:当 100 个 Neuron 对象中只有 1 个需要这两个字段时,那么您可以决定:

  • 不具备全部 4 个字段的 BaseNeuron
  • 一个或多个从该类派生的类,添加它们需要的字段

另请注意,从设计角度来看,这也可能是更好的选择:“空”值始终意味着:需要额外的代码来处理该问题。意思是:如果该数组可以为空...那么当然,处理该字段的所有代码都必须在使用该数组之前检查该数组是否为空。比较一下:没有该数组的类,与您知道该数组始终已设置并可供使用的类。

我并不是说您绝对必须更改您的设计,而是如上所述:您可以减少内存占用,并且这样做可以使您的设计更加清晰。

关于java - 如果声明但未初始化对象的变量是否会使用内存空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57325800/

相关文章:

ios - 内存泄漏 - NSData 和 NSMutableString

memory - 在现有程序中查找和使用内存偏移量?

c++ - 为什么内存地址是偶数?

ruby-on-rails - Ruby on Rails 和类变量混淆

java - 我什么时候会在 Java 中使用类变量与实例变量?

java - 在java中的字符串中过滤\n

java - 无法使用通过 Ruta DECLARE 声明的变量

python:模拟类变量的多重继承

Java SQL输出格式表结果

java - Java 语法的访问者方法在 ANTLR 4.4 中不起作用