在最近的AdaCore Gem中有一个声明
Finalize的实现稍微复杂一些:Ada参考手册表明Finalize过程应该始终是幂等的.Ada编译器可以在同一对象上多次调用Finalize,特别是在发生异常时.
我需要测试一个私人控制类型,
type T is private;
private
type T is new Ada.Finalization.Controlled with ...
Run Code Online (Sandbox Code Playgroud)
我可以更改源以使类型明显受控制
type T is new Ada.Finalization.Controlled with private;
Run Code Online (Sandbox Code Playgroud)
然后只是打电话Finalize (My_T);(甚至My_T.Finalize?); 但有没有什么方法可以导致多次最终确定而不对测试中的软件进行此更改?
通过"发布",我的意思是没有对类加载器的引用.
我们遇到了一个问题,即频繁重新部署的Java EE应用程序会占用permgen空间.分析表明,Java EE应用程序中的单例已经传递了对应用程序之外的应用程序类加载器对象的引用(违反Java EE规则),并且在取消部署应用程序时不会清除它们.
假设单例或类对象没有其他引用,那么在释放类的类加载器时是否会调用单例的finalize()? 我想在那里清除流氓入境参考.或者我是在catch-22中,在类加载器本身可以被垃圾收集之前不会调用finalize - 因此由于流氓外部引用而永远不会被调用?
这里的主要问题可能是:
在这种情况下,类对象是否会被垃圾收集? 这可能取决于类加载器行为的规范,或者可能依赖于实现.
参考文献(另一种!;-))将不胜感激,但不是必需的.
所以,我最近在Java中发现了finalize方法(不知道为什么我之前错过了它,但它确实存在).这似乎可能是我正在处理的许多问题的答案,但我想首先获得更多信息.
在线,我发现这个图表说明了垃圾收集和完成的过程:

几个问题:
我想我应该解释为什么我感兴趣.我经常使用LWJGL,似乎如果我可以使用finalize来使Java对象自动清理OpenGL资源,那么我可以在API方面做一些非常好的事情.
java multithreading garbage-collection memory-management finalize
我是Java新手,在高中时期有一些C++背景.现在我正在努力创造一些东西,我选择Java作为编程语言.
我完成了我的作业,看了很多关于Java的"析构函数",finalize()方法和close()或shutdown()方法.但我仍然认为我不知道这应该如何工作(当然下面有更多信息)
好的,具体的问题是为什么我需要调用close()或shutdown()方法?
在我的特定情况下,我正在使用一个我没有开发处理智能卡读卡器的类,但我已经看到文件管理的情况,你必须调用close()方法,将类似.
不是调用close()方法与在C++中释放内存的想法相同(那很糟糕)?意思是,我必须处理对象的删除或破坏......不是GC的用途吗?
我试图用于智能卡读卡器的类不是最好的选项可能是一个选项,这个类实现finalize()方法可能更好,所以当不再使用并准备好GC时,释放内存(很可能是本机代码)和/或释放GC可能不知道如何操作的硬件资源.
但是文件管理类呢?那些是非常常用和维护的,为什么仍然需要close()方法?我理解存在的目的,解锁文件,但为什么我要记得关闭它?一旦不再使用该对象,则至少在最常见的情况下自动解锁文件.
最后,使用实现finalize()方法的类来包装需要关闭或关闭的类是否是一个正确的解决方法,我调用close()或shutdown()方法?
我已经看到finalize()方法不是很受欢迎,所以这就是我问这个问题应该如何解决的原因.
提前致谢
胡安
PS:我见过的:
我有一个适用于集合的map reduce函数,如下所示:
function Map() {
emit (
this.name,
{
count : 1,
flag : this.flag
}
);
}
function Reduce(key, values) {
var count = 0;
var flag = false;
for (var i in values){
count = count + 1;
if (i.flag)
flag = true;
}
var reduced = {
count : count,
flag : flag
}
return reduced;
}
function Finalize(key, reduced) {
if (reduced.count>10 || reduced.flag){
var finalized = {
"count" : reduced.count
}
return reduced;
}
return …Run Code Online (Sandbox Code Playgroud) 我在下面遇到了这个android代码。有没有在服务中创建静态弱引用对象以获取其引用的用例?我知道静态变量不适合垃圾回收。通常,创建任何静态变量的弱引用是否会更改其gc属性?
例如:
private static WeakReference<MyService> mService;
public static MyService getInstance(){
if(mService != null){
return mService.get();
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
在我的onCreate中
public void onCreate(){
super.onCreate();
mService = new WeakReference<MyService>(this);
}
Run Code Online (Sandbox Code Playgroud) 我看到布料中很少发生崩溃,看起来像这样:
Fatal Exception: java.util.concurrent.TimeoutException: android.text.TextPaint.finalize() timed out after 30 seconds
at android.graphics.Paint.finalizer(Paint.java)
at android.graphics.Paint.finalize(Paint.java:2437)
at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:202)
at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:185)
at java.lang.Thread.run(Thread.java:833)
Fatal Exception: java.util.concurrent.TimeoutException: java.io.FileInputStream.finalize() timed out after 10 seconds
at java.io.FileDescriptor.valid(FileDescriptor.java:87)
at libcore.io.IoUtils.close(IoUtils.java:37)
at java.io.FileInputStream.close(FileInputStream.java:121)
at java.io.FileInputStream.finalize(FileInputStream.java:142)
at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:187)
at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:170)
at java.lang.Thread.run(Thread.java:856)
Run Code Online (Sandbox Code Playgroud)
我不确定为什么以及我的Android应用程序的哪些代码导致这些崩溃,我也无法复制它.也许你们有人有类似的问题并解决它?
我可以将"任何"记录类型传递给我的程序吗?
我多次使用带有字符串的"记录".
type
TR = record
a: string;
b: string;
end;
Run Code Online (Sandbox Code Playgroud)
要清除它们,我需要写:
Finalize(R);
FillChar(R, SizeOf(R), #0);
Run Code Online (Sandbox Code Playgroud)
问题是如何通过任何类型的记录来清除它?
为此我得到了这个提示:"表达式不需要初始化/完成".
procedure ClearRecord(var R);
begin
Finalize(R);
FillChar(R, SizeOf(R), #0);
end;
Run Code Online (Sandbox Code Playgroud)
感谢您的每一个信息!
我已经读过某个方法,每个方法都可以重载.
完成()
当然是一种方法.但在搜索时我也发现你不能重载这个方法.
所以问题是我们可以重载finalize()方法吗?如果是,那么它是如何实施的?
如果我有
public class Foo {
private boolean finalized = false;
public void foo() {
if (finalized)
throw new IllegalStateException("finalize() has been called.");
}
@Override public void finalize() {
super.finalize();
finalized = true;
}
}
Run Code Online (Sandbox Code Playgroud)
它是否有保证,即使面对多个线程,假设只有GC会调用finalize(),它IllegalStateException永远不会被抛出?
我知道,面对finalize()导致对象不可垃圾收集的方法,对象不会被垃圾收集,也可能会调用其他方法.但这finalize()不是那样做的.是否还有foo()被召唤的可能性finalize()?