`
lizhensan
  • 浏览: 370436 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JVM的退出

    博客分类:
  • java
 
阅读更多
public static void main(String[] args) {
		ThreadTest t = new ThreadTest();
		t.test2();
	}

	// jvm什么时候推出
	@Test
	public void test2() {
		// 除直接kill,其它JVM终止都会调用该钩子
		Runtime.getRuntime().addShutdownHook(new Thread() {
			@Override
			public void run() {
				System.out.println("关闭JVM");
			}
		});
		Thread t = new Thread() {
			@Override
			public void run() {
				System.out.println("用户线程正在运行....");
				try {
					Thread.sleep(10 * 1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("用户线程结束....");
			}
		};
		t.setDaemon(false);
		//如果是false,JVM会等到最用一个用户线程跑完才执行终止操作,JVM自动调用Shutdown,用户也可以自行调用System.exit(0)
		//如果是true,说明是守护线程,JVM任务是辅助用的,可有可无,JVM不会等待该线程
		t.start();
		System.out.println("程序执行完毕");
	}

 在eclipse中运行,如果是通过Junit的方式测试运行test2方法,是模拟不出来预想的情况的。直接就退出了,为什么呢?看下Eclipse调用Junit的入口代码就知道了

org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(String[])

try {
			RemoteTestRunner testRunServer= new RemoteTestRunner();
			testRunServer.init(args);
			testRunServer.run();
		} catch (Throwable e) {
			e.printStackTrace(); // don't allow System.exit(0) to swallow exceptions
		} finally {
			// fix for 14434
			System.exit(0);
		}

 

这里显示的调用了退出方法。所以JVM就直接退出并释放资源。

在自己的main函数中由于自己没有主动调用System.exit(0);

把处理权交给了JVM,JVM在退出前会等待所有的用户线程都关闭掉。

 

 public static void main(String[] args) {

ThreadTest t = new ThreadTest();

t.test2();

throw new RuntimeException("xxx");

}

及时main线程抛出异常,JVM一样会等待...

 

java.c  这块处理的源码

/*
 * Always detach the main thread so that it appears to have ended when
 * the application's main method exits.  This will invoke the
 * uncaught exception handler machinery if main threw an
 * exception.  An uncaught exception handler cannot change the
 * launcher's return code except by calling System.exit.
 *
 * Wait for all non-daemon threads to end, then destroy the VM.
 * This will actually create a trivial new Java waiter thread
 * named "DestroyJavaVM", but this will be seen as a different
 * thread from the one that executed main, even though they are
 * the same C thread.  This allows mainThread.join() and
 * mainThread.isAlive() to work as expected.
 */
#define LEAVE() \
    if ((*vm)->DetachCurrentThread(vm) != 0) { \
        JLI_ReportErrorMessage(JVM_ERROR2); \
        ret = 1; \
    } \
    (*vm)->DestroyJavaVM(vm); \
    return ret \

 

分享到:
评论

相关推荐

    javassist+javaAgent探针, 实现jvm退出时打印线程栈日志

    javassist+javaAgent探针, 实现jvm退出时打印线程栈日志,方便排查是哪个线程调用了退出,以及退出码

    JVM运行时数据区

    JVM定义了若干个程序执行期间使用的数据区域。这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁。其他的数据依赖于每一个线程,在线程创建的时候创建,在线程退出的时候销毁。

    Java Interactive Profiler 翻译文档

    交互性,允许你在JVM运行过程中随时启动或结束剖析器而hprof是在程序启动时就开启JVM退出时结束。 2.没有本地代码,大部分剖析器都有一些本地组件(native component)因为这些剖析器使用了需要利用本地组件的JVMPI ...

    执行java请求时导致在脚本执行结束时JVM无法退出

    主要介绍了执行java请求,导致在脚本执行结束时JVM无法退出问题,本文通过原因分析给出解决方案,需要的朋友可以参考下

    JVM实战高手.zip

    34个生产案例,还原真实的 JVM 问题现场!程序计数器、虚拟机栈、本地方法栈 3 个区域随线程生灭(因为是线程私有),栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。而 Java 堆和方法区则不一样,...

    JCMS:Java颜色管理系统

    Java颜色管理系统(JCMS) 一个Java库,用于轻松管理ICC颜色转换。... JVM退出时,将删除临时文件夹。 您可以使用系统属性JCMS_library_path (在启动JVM时添加参数-DJCMS_library_path = / path / to / libs)

    jvm-mon:基于控制台的JVM监视工具

    monLinux / MacOS 下载并解压缩设置JAVA_HOME环境变量: export JAVA_HOME=/path/to/your/jdk8 从解压缩的目录中执行./bin/jvm-mon用法选择一个JVM进程,然后按Enter进行监视按q或Ctrl + C退出按Del或Backspace终止...

    jav程序监控并记录jvm运行时内存、线程、垃圾收集和堆空间

    1. jav程序监控并记录jvm运行时内存、线程、垃圾收集和堆空间 2. 定时记录到本地文件中;...4. 在监控不完善的情况下,可以记录java进程异常退出之前的jvm状态信息; 5. java源码实现,不依赖第三方组件;

    java7rt.jar源码-Java_JVM:这是我的JavaJVM学习笔记

    退出 程序正常结束;程序遇到错误或异常时终止运行;Runtime或System类调用exit()方法或Runtime调用half()方法 JVM的框架: 执行引擎: (字节)解释器 + JIT(java即时编译器) 前者是用 PC计数器 来依次编译每一行代码...

    seleniumFramework:Selenium框架

    Selenium框架 Selenium框架 一个基于Selenium的自动化框架,使用Cucumber / Gherkin来驱动测试用例。 通过使用EventFiringWebDriver +屏幕... JVM退出时,浏览器应关闭。 它仍处于早期阶段,但会一点一点地到达那里!

    系统core和java虚拟机异常退出日志设置

    系统core和java虚拟机异常退出日志设置

    java-buildpack-memory-calculator:Cloud Foundry JVM 内存计算器

    Java Buildpack 内存计算器 Java Buildpack 内存计算器计算整体 JVM 内存配置,目标是确保应用程序运行良好,同时不... 如果无法计算有效配置(例如,必须分配比可用内存多的内存),则会打印错误并返回非零退出代码。

    27天成为Java大神

    exit 退出 补充:rd -s删除的时候询问 rd -q -s直接删除不询问 3:JVM,JRE,JDK三者的区别和关系 JVM:java虚拟机,保证了java语言的跨平台型,为不同的操作系统提供不同的JVM JRE:运行时环境,包括JVM和核心...

    JVM性能优化(四)提高网站访问性能之Tomcat优化

    tomcat 服务器在JavaEE项目中使用率非常高,所以在生产环境对tomcat的优化也变得非常重要了,对于tomcat的优化,主要是从2个方面入手,一是tomcat本身的配置,另一个是tomcat所运行的Jvm虚拟机的调优 二、Tomcat配置...

    阿里大佬总结的Java面试资料.pdf

    JVM (1) 基本概念: JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域...程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不 能共享

    java基础学习笔记 java整合技术 java工具类.rar

    退出: exit 启动dos窗口 win+R 输入cmd 输入jshell 直接可以敲java代码 3.1:JAVA开发工具包 JRE、JDK、JVM JRE是java运行环境,运行java所必需的文件 JDK是开发工具包,增加编译器和调试器等用于程序开发的文件 ...

    java版的学生管理系统

    学生管理系统的实案例需求 ... 只有用户登录成功之后,才能进入到学生管理系统中进行增删改查操作 针对目前我们的所学内容,完成一个综合案例:学生管理系统。该系统主要功能如下: 添加学生:通过键盘录入...退出JVM

    Java核心面试题汇总(最新版)

    程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不 能共享。这里所说的线程指程序执行过程中的一个线程实体。JVM 允许一个应用并发执行多个线程。 Hotspot JVM 中的 Java 线程与原生操作系统线程有直接...

    ryming#open-document#Java安装和配置1

    Java安装和配置配置JDK环境变量添加内容#Java环境变量#根据需求配置JVM优化参数保存退出。

    StudentManager.zip

    jvm 支撑的短暂学生管理系统 可添加,修改,查询,删除,退出 以及判断学号是否需重复或不存在的问题

Global site tag (gtag.js) - Google Analytics