我只是想知道我的计划背后发生了什么,当我声明并初始化变量,后来与其他值,例如重新初始化一个ArrayList或类似的东西。

在我的内存会发生什么事,当我说例如这样:

ArrayList<String> al = new ArrayList<String>();
...add values, work with it and so on....

al = new ArrayList<String>();

所以我的第一ArrayList的RAM中保持或将所述第二ArrayList的被存储在相同的位置,其中第一个已前?还是会只是改变的“人”的提法?

如果它不被替换...是有办法来手动释放,其通过所述第一数组列表占据的RAM? (不用等待垃圾收集器) 它是否有助于将其第一=空?

尼斯问候, poeschlorn

有帮助吗?

解决方案

您发布的代码将分配一个新的ArrayList实例。如果你想重复使用相同的一个,你可以这样做:

ArrayList<String> al = new ArrayList<String>();
...add values, work with it and so on....

al.clear();
// now you can use a1

但这样做谨慎 - 如果传递a1到将要使用它一段较长时间的其他代码的初始实例,然后清除它会导致问题,您将需要一个单独的实例。

但也注意到,你从回收的对象数组和的ArrayList得到储蓄不是很大。如果你存储在该ArrayList 10×4096字节串,数组列表本身只占用空间成比例的参考文献的尺寸,例如大约4个字节×10 = 40个字节。这是一种简化,但原则是正确的。所以,即使你重复使用相同的数组列表,你只是在为自己节省用于存储对象引用,而不是对象本身的内存。考虑到这一点,并通过修改集合无意中,我想大多数人也懒得回收名单造成错误的风险。

在一个现代化的虚拟机内存管理真的非常好,当你看到有需要时,才应开始引入内存“优化”。事实上,使用的对象比其天然寿命更长可对垃圾收集的性能具有负面影响。

我的建议是,代码很清楚第一,个人资料,只有当你看到有一个问题,并已确定病因着力优化内存使用。

祝你好运!

其他提示

在新的ArrayList将被从存储器的一些不同部分分配,参考被改变成指向它,如果旧的ArrayList不再被别的东西称为,这将是垃圾收集。有没有办法在Java中手动释放内存。它自动发生。

设置变量零是无关紧要的,当它被设置为后右别的东西或它是一个局部变量,其反正很快得到的范围从(但内部数据结构如ArrayList,设置包含阵列为null的元素,当的元件被去除时,需要以避免内存泄漏)。

在Heap新空间将被分配给新的ArrayList。

您不能强制垃圾收集和分配空只会吃起来处理器周期。您可以拨打System.gc()建议的JVM运行垃圾收集器,但没有保证。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top