即使没有在构造函数中使用:
public Neuron(float[] connection, float bias) {
this.connection = connection;
this.bias = bias;
}
在执行构造函数之前,初始化所有实例字段(因此name和可propability )。 这些是使用默认值初始化的:
private String name; // null
private float propability; // 0F
但是这些默认值不需要任何费用( null和0 )。
所以不要为此烦恼。
我有一个课我想要使用大约十到十万。 因此,我没有不必要地浪费内存位置。
如果是的话,我还有其他选择(除了让它们成为自己的类)以减少内存使用量吗?
如果这些对象具有一些常见数据,请在实例之间共享这些数据。
依赖于共享数据不可变性的飞行模式说明了这种做法。
完全同意GhostCat的注释:字段甚至没有使用消耗内存。 不是很多,但他们消费。 但这适用于Java中的许多类。
例如,我们不会用数组替换所有列表,因为数组通常消耗较少。 我们会这样做,因为在我们的具体情况下,列表内存占用是一个真正的担忧。
总而言之,在优化和改变我们的设计之前,我认为要做的第一件事就是测量并且要考虑是否要优化以获得金币或坚果。
使用您的实际代码和生成1百万个Neuron的main()方法,我注意到消耗了大约131 Mo :
public static void main(String[] args) {
long beforeUsedMem=Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();
List neurons = new ArrayList<>();
for (int i = 0; i < 1_000_000; i++) {
neurons.add(new Neuron(new float[] { 0, 15.4F, 1.1F, 2.1F, 3.4F, 4.5F, 8.9F, 158.9F, 8648.9F, 80.9F, 10.9F, 1450.9F, 114.9F, 14.5F, 4444.4F }, 1.9F));
}
long afterUsedMem=Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();
long actualMemUsed=(afterUsedMem-beforeUsedMem)/1_000_000;
System.out.println(actualMemUsed + " Mo");
}
客观地,它很低。
通过移除未使用的字段,它下降到大约124 Mo (7 Mo以下):
private String name;
private float propability;
对于如此多的创建对象,131 Mo为124 Mo是非常低的值:100万。
如果类声明了十几个未使用的字段,那么事情会有所不同。 不可忽视的内存量将被浪费,整体而言,在设计方面根本不清楚:内聚力低。
但事实并非如此。