java未初始化变量_java - (Java)如果声明但未初始化,对象的变量是否使用内存空间? - 堆栈内存溢出...

即使没有在构造函数中使用:

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万。

如果类声明了十几个未使用的字段,那么事情会有所不同。 不可忽视的内存量将被浪费,整体而言,在设计方面根本不清楚:内聚力低。

但事实并非如此。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值