`
kabike
  • 浏览: 606008 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Java中注册进程退出时的清理函数

阅读更多
java里利用addShutdownHook可以添加一个线程,在jvm关闭时调用,执行一些清理工作

public static void main(String[] args) throws InterruptedException {
		Thread shutdownHook = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("jvm going down!do something here!");
			}

		});
		Runtime.getRuntime().addShutdownHook(shutdownHook);

		while (true) {
			TimeUnit.SECONDS.sleep(1);
		}

	}


但是这个线程不能保证总是工作.
引用
In rare circumstances the virtual machine may abort, that is, stop running without shutting down cleanly. This occurs when the virtual machine is terminated externally, for example with the SIGKILL signal on Unix or the TerminateProcess call on Microsoft Windows. The virtual machine may also abort if a native method goes awry by, for example, corrupting internal data structures or attempting to access nonexistent memory. If the virtual machine aborts then no guarantee can be made about whether or not any shutdown hooks will be run.

所以kill -9的时候,就不能保证这个清理函数的执行了
分享到:
评论

相关推荐

    僵尸进程介绍以及防范

    2. 设置信号处理器:父进程可以设置SIGCHLD信号处理器,在接收到子进程退出的通知时进行回收。 3. 使用`fork()`-`exec()`模式:先`fork()`创建子进程,然后在子进程中执行`exec()`系列函数替换进程映像,这样即使父...

    Java加载dll,导致Java进程内存泄露

    - **实现资源清理**:在DLL中定义适当的析构函数或清理函数,以确保在不再需要时释放资源。 - **使用智能指针**:在C++代码中,可以使用智能指针如`std::unique_ptr`或`std::shared_ptr`来自动管理内存。 此外,...

    守护进程(C语言写的360绝对杀不死)

    1. ** fork() 操作**:首先,调用fork()函数创建一个子进程,父进程退出,子进程成为孤儿进程。 2. ** setsid()**:调用setsid()函数创建新的会话并使进程成为会话领导者的进程组首进程,从而脱离原始会话。 3. **...

    Linux 环境如何使用 kill 命令优雅停止 Java 服务.pdf

    首先,需要了解的是,当我们在Linux系统中运行Java服务时,这些服务以进程形式存在。一旦需要停止这些服务,常见的做法是杀死这些进程。在Linux中,kill命令是用来发送信号给进程,告诉进程如何反应的。正确的使用...

    完全退出程序的方法.zip

    这些函数或方法会触发程序的清理工作,如关闭打开的文件、释放内存等。 总的来说,完全退出程序涉及到程序生命周期的理解、操作系统对进程和内存的管理,以及用户界面的设计原则。正确实现完全退出不仅保障了系统的...

    android JNI进程守护service

    通过JNI,我们可以用C/C++编写原生库,然后在Java代码中调用这些函数,实现跨语言交互。 2. **子进程**:在C/C++代码中,我们可以使用`fork()`或`posix_spawn()`等系统调用来创建子进程。子进程继承了父进程的一些...

    checkstyle和jacob关闭进程

    通过Jacob,Java程序能够调用Windows API函数、与ActiveX控件进行交互,甚至操作Excel、Word等Office应用程序。这对于开发跨平台的Java应用,尤其是需要与Windows系统深度整合的场景,非常有用。 然而,在使用...

    Java对象的生命周期[参照].pdf

    例如,JVM在接收到特定信号时会尝试执行已注册的钩子函数,以便在退出前执行必要的清理工作。 总的来说,Java对象的生命周期包括创建、使用、垃圾回收和销毁,这个过程受到JVM、类加载器、垃圾回收机制以及高级框架...

    exits完全退出

    当用户选择退出时,只需调用`exit()`方法即可关闭所有活动并终止应用进程。这种方法不仅简洁高效,而且易于理解和实现。 需要注意的是,`System.exit(0)`方法的使用需谨慎,因为它会立即终止整个Java虚拟机(JVM)...

    kill命令在Java应用中使用的注意事项小结

    例如,在上面的代码中,当使用`Runtime.getRuntime().addShutdownHook()`方法注册了一个新的线程,当接收到系统关闭信号时,这个钩子函数会被调用,从而允许执行一些清理工作,如关闭数据库连接、资源释放等。...

    WPF 基于 WER 注册应用崩溃无响应回调和重启方法.rar

    通过注册WER回调,可以在应用程序无响应时执行清理工作,例如关闭资源占用或释放内存。 1. **定义回调函数**:创建一个回调函数,当WER检测到应用无响应时调用。 ```csharp [UnmanagedFunctionPointer...

    Linux通用java程序启动脚本代码实例

    脚本结构清晰,每个功能(如启动、停止、检查状态)封装在独立的函数中,便于理解和维护。 7. **安全性与最佳实践**: 脚本使用非root用户运行程序,遵循了最小权限原则。同时,使用`nohup`避免了终端关闭时程序...

    Android通过JNI实现守护进程

    在Android 4.4中,当应用退出时,ActivityManagerService通过`killProcessQuiet(pid)`直接结束主进程。而在Android 5.0及以上版本,它还会使用`killProcessGroup()`杀掉整个进程组,导致子进程一同结束。因此,要在...

    对一个对端已经关闭的socket调用两次write, 第二次将会生成SIGPIPE信号, 该信号默认结束进程.zip

    2. **捕获并处理SIGPIPE信号**:通过注册一个信号处理函数,可以捕获SIGPIPE信号并执行适当的清理工作,例如关闭Socket,然后退出或继续运行。 3. **检查连接状态**:在写入数据之前,检查Socket的状态,确保对端...

    Java面试宝典

    线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程中的多个线程共享该进程的资源,如内存空间,但各自拥有独立的栈和局部变量。 以上知识点涵盖了Java基础部分和...

    weblogic jms c程序

    2. 在`main()`函数中,使用`pthread_cleanup_push()`和`pthread_cleanup_pop()`包装可能需要清理的资源,比如关闭JMS连接。 3. 考虑使用`pthread_join()`等待所有子线程结束,以确保在退出前它们能正确完成工作。 4....

    2012最新java面试大全--很有帮助的

    Android采用基于权限的安全模型,应用程序必须在AndroidManifest.xml中声明所需的权限,并且在运行时请求敏感权限。 ### 32. Android如何处理多线程? Android支持多线程编程,可以通过Thread类、Runnable接口、...

    内核API的详细说明.pdf

    - `SYSEXIT`:用于退出用户进程,清理进程槽; 这些调用的状态对比MINIX2有所变化,标记为“U”表明其在MINIX3中得到了更新或增强。 ### 结论 综上所述,《内核API的详细说明.pdf》不仅深入剖析了MINIX3中内核...

Global site tag (gtag.js) - Google Analytics