问题标签 [resource-disposal]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 如何强制 Java 线程关闭线程本地数据库连接
使用线程本地数据库连接时,需要在线程存在时关闭连接。
只有当我可以覆盖调用线程的 run() 方法时,我才能做到这一点。即使这也不是一个很好的解决方案,因为在退出时,我不知道该线程是否曾经打开过连接。
这个问题实际上更普遍:如何强制线程在退出时调用线程本地对象的某些终结方法。
我查看了java 1.5的源码,发现线程本地映射设置为null,最终会导致垃圾收集调用finalize(),但我不想指望垃圾收集器。
为了确保关闭数据库连接,以下覆盖似乎是不可避免的:
其中release()关闭数据库连接,如果它已打开。但是我们不知道线程是否曾经使用过这个线程本地。如果 get() 从来没有被这个线程调用过,那么这里就很浪费精力:将调用ThreadLocal.initialValue(),将在这个线程上创建一个映射,等等。
根据 Thorbjørn 的评论,进一步澄清和举例:
java.lang.ThreadLocal是一种绑定到线程的对象的工厂类型。这种类型有一个对象的 getter 和一个工厂方法(通常由用户编写)。当 getter 被调用时,它仅在该线程之前从未调用过它时才调用工厂方法。
使用ThreadLocal允许开发人员将资源绑定到线程,即使线程代码是由第三方编写的。
示例:假设我们有一个名为MyType的资源类型,我们希望每个线程只有一个资源类型。
在使用类中定义:
在此类的本地上下文中使用:
get()在调用线程的生命周期中只能调用一次initialValue() 。此时,MyType的一个实例被实例化并绑定到该线程。此线程对get()的后续调用再次引用此对象。
经典用法示例是MyType是一些线程不安全的文本/日期/xml 格式化程序。
但是这样的格式化程序通常不需要释放或关闭,数据库连接需要,我使用java.lang.ThreadLocal来为每个线程建立一个数据库连接。
在我看来,java.lang.ThreadLocal几乎是完美的。几乎是因为如果调用线程属于第三方应用程序,则无法保证资源的关闭。
我需要你的聪明才智:通过扩展java.lang.ThreadLocal,我设法为每个线程绑定了一个数据库连接,因为它是专用的——包括我无法修改或覆盖的线程。我设法确保连接关闭,以防线程因未捕获的异常而死亡。
在正常线程退出的情况下,垃圾收集器关闭连接(因为MyType覆盖了finalize())。实际上它发生得很快,但这并不理想。
如果我按照自己的方式行事,那么java.lang.ThreadLocal上会有另一种方法:
如果此方法存在于java.lang.ThreadLocal上,由 JVM 在任何线程退出/死亡时调用,那么在我自己的覆盖中我可以关闭我的连接(并且救赎者会来到锡安)。
在没有这种方法的情况下,我正在寻找另一种方法来确认关闭。一种不依赖 JVM 垃圾收集的方法。
c# - C#如何追踪字体处理
我有一个正在处理的字体导致异常,我找不到该字体的处理位置。我感觉它正在被打印预览处理掉。有人可以推荐如何追踪这个问题吗?
谢谢。
java - 如何从终结器(资源对象)中抛出异常
终结器不是析构函数,终结器是无用的。
据我所知,很多 Java 资源对象都在 finalize() 上“以防万一”。
这似乎是一种过于宽容的态度,可能会导致错误。
您至少要做的是 finalize 记录错误(在最终确定时未处置的资源)并将它们打印到标准输出然后处置。
一种更严格的态度可能是对例外情况进行处理。我不一定要实现这样的限制性资源对象,但我想知道如何去做。
但是在 Java 中,终结器中抛出的异常被忽略(然后对象被放回列表中以再次终结)。有没有办法实现这样的事情?如果创建对象的线程仍然存在(或者如果不存在,则可能是父线程?
还!!!!!其他 gc 语言(尤其是 C#、python 等)如何处理资源终结(它们通常是否为资源类实现“以防万一处置”?),从终结器中抛出,向其他线程提供例外。(注意:我不太关心使用/使用糖来调用 dispose 方法或接受自动关闭资源的闭包的方法,我对终结器所扮演的角色以及终结器的错误传播很感兴趣)。
delphi - Delphi 应用程序中的内存泄漏。如何正确处理对象和字符串?
我的问题是关于调试似乎是一场噩梦的内存泄漏。
在我的应用程序中有一个简单的类派生自TObject
. 该类的所有对象都存储在派生自的类的集合/列表中TObjectList
:
使用场景:
爬虫下载商品,解析并保存到对象集合中。这种方法似乎很方便,因为我可以稍后引用对象(填充网格/列表,将它们写入文件等)
问题是正确处理对象以避免内存泄漏。该应用程序在启动时分配 ~4Mb 内存,但处理后 ~12k 提供它吞噬 32Mb。进程完成后未正确处理的对象/变量导致的泄漏。
ReportMemoryLeaksOnShutdown
显示可怕的数字,但关键是 - 我不知道在哪里看以及如何正确调试该死的东西。
var MyString: string
另一个例子是也需要适当处理的变量!这对我来说是一种洞察力:) 我认为每个过程/函数都会自动管理范围外变量的垃圾收集。
报价列表由一个函数创建:
然后我直接将这些报价作为一个集合来处理。关键是我希望这个应用程序 24/7 运行,所以正确的资源处理是必须的。
- 如何正确处置上述类型的对象?
- 我应该考虑管理对象/对象列表的其他技术吗?
- 如何正确处理类型变量
string
? - 您能否建议有关在 Delphi 中对抗内存泄漏的好读物?
谢谢你。
jenkins - 詹金斯异步资源处理器问题
所以,我已经安装Jenkins
了这个异步资源处理器插件。
我的问题:有没有办法清理插件收集的资源,因为如果我不手动清理,似乎每次都消耗越来越多的 CPU?
有时它只是让人Jenkins
反应迟钝。
那么,有没有更好的方法来清理这些资源呢?截至目前,我不在乎它正在捕获什么,所以如果我只是删除插件或使用 API 每晚清理这些资源的方式是否存在问题?