use*_*484 5 java arrays object dynamic-arrays
ArrayList<Object> foo;
Object[] bar;
Run Code Online (Sandbox Code Playgroud)
典型的终结者会这样做
foo = null;
bar = null;
Run Code Online (Sandbox Code Playgroud)
我的问题,将ArrayList调用一个终结器,它将它保持的任何指针设置为null,或者我是否必须单步执行列表
for(i=1; i<foo.size(); i++) foo.set(i,null); ???
Run Code Online (Sandbox Code Playgroud)
另一个问题是:对于数组,我是否需要将其任何内容设置为null,如
for(i=1; i<bar.length; i++) bar[i] = null;
Run Code Online (Sandbox Code Playgroud)
或者是否足以让整个内存块被丢弃并且之后的任何指针都超出了范围?
对不起,如果问题很愚蠢.
在阅读了我发现的答案之后,没有什么可以自己实现的.
一些消息来源表示,如果这样的事情(内存吃应用程序)发生,这是由于糟糕的设计.
我的核心问题是:经常做
struct = new LargeStructure();
Run Code Online (Sandbox Code Playgroud)
这会带来记忆吗?
或者这只需要其中一个结构的记忆?
顺便说一句:问题出现在运行tomcat的webapp中,并且只有一个会话处于活动状态,它将所描述的指针保存为会话变量.
当所有对象不再被引用时,它们将自动由垃圾收集器进行 GC。你不必担心它。如果将数组引用设置为null,那么如果没有其他对该数组对象的实时引用,该数组对象本身就有资格进行 GC,如果不再有对数组的元素的实时引用,则该数组的元素将有资格进行 GC。
根据文档:
protected void finalize() throws Throwable
Run Code Online (Sandbox Code Playgroud)
当垃圾收集确定不再有对该对象的引用时,由该对象的垃圾收集器调用。子类重写 Finalize 方法来处理系统资源或执行其他清理。
该finalize()方法将在 GC 检测到该对象不再可达之后、实际回收该对象使用的内存之前调用。如果对象永远不会变得不可访问,或者 GC 不运行,则finalize()可能永远不会被调用。
您可以尝试finalize()通过调用System.runFinalization()来强制 JVM 调用:
运行任何挂起终结的对象的终结方法。
调用此方法表明 Java 虚拟机花费精力来运行已发现已被丢弃但尚未运行其 Finalize 方法的对象的 Finalize 方法。当控制权从方法调用返回时,Java 虚拟机已尽最大努力完成所有未完成的终结。