你认为这个问题的面试最佳答案是什么?
我想我在这里找不到这个副本,如果有的话请链接.
在我的Galaxy Tab 2(三星)上启动我的应用程序时,我一直收到此错误.我正在开发的应用程序非常复杂,很难找到此错误源自何处.所以我开始逐个删除我的应用程序,我最终得到了一个mapview应用程序,你可以在这里找到
剥离后我最终得到的应用程序只是没有overlayItem的mapview!所以按照教程直到第1部分第9点.
这是MapView活动:
package com.****.googlemapstutorial;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import android.os.Bundle;
import android.view.Menu;
public class MainActivity extends MapActivity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我真的被踩了!
有人建议吗?
The error:
10-28 21:09:22.872: E/System(16840): Uncaught exception thrown by finalizer
10-28 21:09:22.872: E/System(16840): java.lang.IllegalStateException: Binder has been finalized!
10-28 21:09:22.872: …Run Code Online (Sandbox Code Playgroud) 我们最近将我们的消息处理应用程序从Java 7升级到Java 8.自升级以来,我们偶尔会遇到一个流在读取时被关闭的异常.记录显示终结器线程正在调用finalize()保存流的对象(进而关闭流).
代码的基本概要如下:
MIMEWriter writer = new MIMEWriter( out );
in = new InflaterInputStream( databaseBlobInputStream );
MIMEBodyPart attachmentPart = new MIMEBodyPart( in );
writer.writePart( attachmentPart );
Run Code Online (Sandbox Code Playgroud)
MIMEWriter并且MIMEBodyPart是本土MIME/HTTP库的一部分. MIMEBodyPart扩展HTTPMessage,具有以下内容:
public void close() throws IOException
{
if ( m_stream != null )
{
m_stream.close();
}
}
protected void finalize()
{
try
{
close();
}
catch ( final Exception ignored ) { }
}
Run Code Online (Sandbox Code Playgroud)
异常发生在调用链中MIMEWriter.writePart,如下所示:
MIMEWriter.writePart() 写入部件的标题,然后调用 part.writeBodyPartContent( this )MIMEBodyPart.writeBodyPartContent()调用我们的实用工具方法 …我对WPF比较陌生,有些东西对我来说很陌生.首先,与Windows窗体不同,WPF控件层次结构不支持IDisposable.在Windows窗体中,如果用户控件使用任何托管资源,则通过覆盖每个控件实现的Dispose方法来清理资源非常容易.
在WPF中,故事并不那么简单.我搜索了几个小时,遇到了两个基本主题:
第一个主题是微软明确指出WPF没有实现IDisposable,因为WPF控件没有非托管资源.虽然这可能是真的,但他们似乎完全错过了WPF类层次结构的用户扩展可能确实使用托管资源(直接或通过模型间接)的事实.通过不实现IDisposable,Microsoft已经有效地删除了唯一保证机制,通过该机制可以清除自定义WPF控件或窗口使用的非托管资源.
其次,我发现了一些对Dispatcher.ShutdownStarted的引用.我曾尝试使用ShutdownStarted事件,但似乎没有为每个控件触发.我有一堆WPF UserControl,我已经为ShutdownStarted实现了一个处理程序,它永远不会被调用.我不确定它是否只适用于Windows,或者WPF App类.但是它没有正确触发,每次应用程序关闭时我都会泄漏打开的PerformanceCounter对象.
清理非托管资源是否有比Dispatcher.ShutdownStarted事件更好的替代方案?是否有一些技巧来实现IDisposable,以便调用Dispose?如果可能的话,我更愿意避免使用终结器.
如果在finalize调用期间保存对当前对象的引用会发生什么?例如:
class foo {
...
public void finalize() {
bar.REFERENCE = this;
}
}
Run Code Online (Sandbox Code Playgroud)
对象是否被垃圾收集?当您稍后尝试访问时会发生什么bar.REFERENCE?
我有以下类,它是一个IDisposable对象的装饰器(我省略了它添加的东西),它本身IDisposable使用一个通用模式实现:
public class DisposableDecorator : IDisposable
{
private readonly IDisposable _innerDisposable;
public DisposableDecorator(IDisposable innerDisposable)
{
_innerDisposable = innerDisposable;
}
#region IDisposable Members
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
~DisposableDecorator()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
_innerDisposable.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
我可以很容易地测试innerDisposable时被布置Dispose()叫做:
[Test]
public void Dispose__DisposesInnerDisposable()
{
var mockInnerDisposable = new Mock<IDisposable>();
new DisposableDecorator(mockInnerDisposable.Object).Dispose();
mockInnerDisposable.Verify(x => x.Dispose());
}
Run Code Online (Sandbox Code Playgroud)
但我怎么写一个测试,以确保innerDisposable它不会得到安置被终结?我想写这样的东西,但它失败了,大概是因为GC线程没有调用终结器:
[Test]
public void Finalizer__DoesNotDisposeInnerDisposable()
{ …Run Code Online (Sandbox Code Playgroud) 终结器是否保证在某些时候在.NET中执行(备用断电等)?我知道GC是如何工作的,并且当它们完全运行时它是不确定的.
(搜索没有显示出良好的答案,所以我加入了这个问题,期望与不那么容易发现的实际答案合并.除此之外,我已经知道了答案,我将要添加几天之后如果没有人提到它.)
我知道最好的做法是在任何实现IDisposable的对象上调用Dispose,尤其是包装有限资源的对象,如文件句柄,套接字,GDI句柄等.
但我遇到的情况是我有一个具有Font的对象,我将不得不通过几层对象检测IDisposable,并查看很多用法,以确保我总是让Font处理掉.而且我想知道这是否值得复杂.
如果Font包装了一个HFONT,那将是一回事,因为GDI资源是系统全局的.但是Font没有包装GDI句柄; 它是GDI +,它是一个完全独立的系统,据我所知,它是流程本地的,而不是像GDI那样的系统全局.与Image不同,Font不会保留文件系统资源(我知道,无论如何).
所以我的问题是:让Font收集垃圾的实际成本是多少?
我知道我会在终结器上受到轻微的打击,但如果"泄露的"字体的数量很小(比如说6个),那么真正的打击就不会引人注意.除了终结器之外,这与分配中型阵列并让GC清理它似乎没什么不同 - 它只是内存.
在让Font得到GCed时,我不知道有什么成本吗?
我有一个托管对象调用COM服务器来分配一些内存.在托管对象消失之前,托管对象必须再次调用COM服务器以释放该内存,以避免内存泄漏.此对象实现IDisposable以帮助确保正确释放内存的COM调用.
如果没有调用该Dispose方法,我希望对象的终结器释放内存.问题是,最终确定的规则是你不能访问任何引用,因为你不知道在你之前已经GC和/或最终确定了哪些其他对象.这使得唯一可触摸的对象状态为字段(句柄是最常见的).
但是调用COM服务器涉及通过运行时可调用包装器(RCW)来释放我有一个存储在字段中的cookie的内存. 从终结器调用RCW是否安全(是否保证此时没有GC或最终确定)?
对于那些不熟悉终结的人来说,虽然终结器线程在托管应用程序域运行的同时在托管应用程序域的后台运行,但是对于那些触摸引用的情况理论上可以正常,最终化也会在appdomain shutdown和任何顺序中发生 - 不是只是在参考关系顺序.这限制了您可以认为从终结器触摸的安全性.即使引用为非null,对托管对象的任何引用都可能是"坏"(收集的内存).
更新:我刚试了一下,得到了这个:
myassembly.dll中发生未处理的"System.Runtime.InteropServices.InvalidComObjectException"类型异常
附加信息:无法使用已与其基础RCW分离的COM对象.
这主要是出于好奇.
如果有人遇到Object.finalize()的任何良好用法,除了调试/记录/分析目的外,我还在徘徊?
如果你没有遇到任何你会说好的用法会是什么?
finalizer ×10
.net ×5
java ×3
c# ×2
android ×1
com ×1
destructor ×1
dispose ×1
exception ×1
finalize ×1
fonts ×1
gdi+ ×1
idisposable ×1
java-8 ×1
mapactivity ×1
struct ×1
unit-testing ×1
wpf ×1