我有一个在java(1.6)中运行的关键进程,带有一个注册的关闭钩子.在某些情况下我得到一个OOM问题(下面有关于该问题的更多细节),该过程突然停止,我没有得到任何我的日志,我的捕获(Throable x)没有捕获异常.
但是关闭钩子有效.因此,如果有一种方法可以知道由于某些令人讨厌的OOM而导致进程停止,我可以在退出之前记录必要的信息.
有没有办法做到这一点?
关于OOM:不确定什么是例外,因为我说它不会被抓住.我知道这是一个OOM因为我开始这个过程
-XX:+HeapDumpOnOutOfMemoryError
Run Code Online (Sandbox Code Playgroud)
我得到一个堆转储文件.在其他情况下,会捕获异常,并且它是ava.lang.OutOfMemoryError:超出了GC开销限制.但不确定这种情况总是如此.
编辑:
如果不清楚:我不是试图阻止OOM,因为它可能在某些情况下出于正当理由,我只是想确保在应用程序日志文件中清楚
我的问题是:是否有可能在关机钩子中发现由于OOM导致进程正在关闭?
我需要以编程方式和相同的过程进行此操作.
目前最好的方法是查看是否存在process_.hprof(我知道pid)的堆转储文件java_pid_pid,其中包含最近的日期并推断出有一个OOM.我想我可以尝试Runtime.getRuntime().freeMemory()并报告问题,如果可用的内存非常低,但不确定这是多么可靠,可能当进程关闭时它已经释放了很多内存,方法以上是我认为最好的.
我有一个注册使用的关闭功能register_shutdown_function()需要很长时间才能完成.PHP max_execution_time会导致PHP终止此函数还是会一直运行直到它完成或出错?
我正在使用获得许可的API,该API具有从具有有限数量许可证的许可证服务器获取/释放许可证对象的方法.在我的应用程序开始时,我调用该方法获取许可证,但我想确保即使我的程序突然终止/崩溃(例外,SIGTERM等)也会释放它.关闭钩子是解决此问题的最佳方法吗?
如果在java中执行关闭挂钩期间抛出未捕获的异常,jvm是否立即退出而不运行其余已注册的关闭挂钩(如果有)?来自javadocs:
通过调用线程的ThreadGroup对象的uncaughtException方法,可以在shutdown钩子中处理未捕获的异常,就像在任何其他线程中一样.此方法的默认实现将异常的堆栈跟踪打印到System.err并终止该线程; 它不会导致虚拟机退出或停止.
似乎其他关机钩子应该运行...
作为一个后续问题,拥有一段可能在关闭钩子中引发异常的代码可能不是一个好主意?如果你无法避免它,尝试捕获关闭钩子内的异常是一个好习惯吗?
我有一个在tomcat上运行的简单Web应用程序.此Web应用程序将文件读写到HDFS.
我面临的问题是每次我使用停止服务器./bin/shutdown.sh.我无法加载hadoop shutdownHookManager异常.
我确定hadoop-common(包含ShutDownManager)在tomcat类路径中.
谁能帮我吗?
我得到的例外:
Oct 14, 2013 5:57:54 PM org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks
SEVERE: The web application [] created a ThreadLocal with key of type [com.ebay.kernel.calwrapper.CalTransactionHelper$1] (value [com.ebay.kernel.calwrapper.CalTransactionHelper$1@3d5a1c5f]) and a value of type [com.ebay.kernel.calwrapper.CalTransactionHelper.Stack] (value [[]]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
Oct 14, 2013 5:57:54 PM org.apache.coyote.AbstractProtocol stop
INFO: Stopping ProtocolHandler ["http-bio-8080"]
Oct 14, 2013 5:57:54 …Run Code Online (Sandbox Code Playgroud) 我是通过JNI从C++代码启动JVM的.我有一个问题,当刚刚退出我的C++进程时,似乎没有运行来自JVM的一些关闭挂钩,因此一些临时资源仍然存在,在我的特定情况下,在我下次打开C++进程时会阻止启动JVM.我试过jvm-> DestroyJavaVM(),但是在我的所有进程窗口关闭后,我仍然可以看到进程正在运行.什么是最好的等待确保JVM在通过JNI启动时正常关闭?
谢谢!
我正在运行一些Java应用程序,我需要从windows bat脚本优雅地关闭/关闭所有应用程序.所以我的问题是:
如何通过windows bat脚本调用shutdown hook并正常关闭java程序.
任何建议表示赞赏.提前致谢.
如何在PHP的关闭函数中测试退出是否干净?
通过干净退出我的意思是脚本没有因为错误而终止.
我最近需要向我拥有的Scala应用程序添加一个关闭挂钩,并且我发现Scala为此提供了一个名为ShutdownHookThread的帮助器。在其源代码中,我注意到它将新线程设置为守护程序线程。
def apply(body: => Unit): ShutdownHookThread = {
val t = new ShutdownHookThread(hookName()) {
override def run() = body
}
t setDaemon true // <--------- right here
runtime addShutdownHook t
t
}
Run Code Online (Sandbox Code Playgroud)
为什么要这样做?在我看来,您可能想要关闭钩子线程中的相反内容(即,确保在关闭jvm之前退出该线程)。还是守护程序/非守护程序与关闭挂钩无关?
我正在读这篇文章
这里是完成消费者线程的代码:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.out.println("Starting exit...");
consumer.wakeup(); 1
try {
mainThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Run Code Online (Sandbox Code Playgroud)
据我了解,ShutdownHook 在所有非守护线程完成但在进程被操作系统销毁之前调用。
1. 从我的角度来看 mainThread.join() 是没有用的。主线程总是会在 ShutdownHook 执行的那一刻结束。这是正确的还是我误解了什么?
2.其实我不明白为什么我们需要等待主线程?我们需要等待 close 方法执行吗?
书中提供了以下主要方法代码:
try {
// looping until ctrl-c, the shutdown hook will cleanup on exit
while (true) {
ConsumerRecords<String, String> records =
movingAvg.consumer.poll(1000);
System.out.println(System.currentTimeMillis() + "-- waiting for data...");
for (ConsumerRecord<String, String> record :
records) {
System.out.printf("offset = %d, key = %s,
value …Run Code Online (Sandbox Code Playgroud) java multithreading shutdown-hook apache-kafka kafka-consumer-api
shutdown-hook ×10
java ×8
jvm ×3
php ×2
apache-kafka ×1
batch-file ×1
c++ ×1
hadoop ×1
memory ×1
scala ×1
shutdown ×1
tomcat ×1
windows ×1