在Java中,在很短的时间内,在一个长时间运行的线程中创建了太多的不可变对象
我有一个不可变的数据类型,如下所示:在Java中,在很短的时间内,在一个长时间运行的线程中创建了太多的不可变对象,java,multithreading,garbage-collection,Java,Multithreading,Garbage Collection,我有一个不可变的数据类型,如下所示: public class TestData { private final double x; private final double y; public TestData (double xx, double yy) { x = xx; y = yy; } } 由于TestData是不可变的,因此在使用TestData时,我必须创建一个新对象。在一个长时间运行的线程中,我在很短的时间内创建了太多的对象。现在我想知道,
public class TestData {
private final double x;
private final double y;
public TestData (double xx, double yy) {
x = xx;
y = yy;
}
}
由于TestData
是不可变的,因此在使用TestData
时,我必须创建一个新对象。在一个长时间运行的线程中,我在很短的时间内创建了太多的对象。现在我想知道,GC清除这些对象是一个额外的负担,还是GC足够聪明地删除短期对象?只要我的应用程序还在运行,这是增加内存使用的原因吗
public void test() {
TestData[] tempData = new TestData [5000];
while (true) {
for (int i = 0; i < tempData.length; i++) {
tempData[i] = new TestData(0.0, 0.0);
}
//process tempData
tempData[5] = new TestData(1.5, 8.5);
//...
tempData[55] = new TestData(2.5, 3.5);
//...
tempData[100] = new TestData(0.0, 0.0);
//...
}
因为您有一个数组,所以您正在存储实例,如果您“重置”该值,您将始终使用相同的实例,因此以前的
tempData
也将更改。所以,如果你想让每个单元格都有不同的值,你需要为它们生成一个新的实例。你真的有内存问题吗?除非你是,否则这种策略是过早的优化。垃圾收集器非常聪明,有时试图让事情变得更简单只会导致问题。是否应该让对象可变以提高性能只能通过可靠地首先测量性能来决定。不过,你可以肯定的是,你要确保最小化保存对象的变量的范围。真的有必要拥有5000个相同值的不同不可变实例吗?你不能用TestData(0,0)概要文件的一个实例初始化数组吗。拍打一大块对象(可以说是50万个),然后在分析器下运行它。如果你不能接受你所看到的,那就改变它
public void reset() {
x = 0.0;
y = 0.0;
}
public set(double xx, double yy) {
x = xx;
y = yy;
}
//process tempData
tempData[5].set(1.5, 8.5);
//...
tempData[55].set(2.5, 3.5);
//...
tempData.reset();
//...