package test;

public class JVMTestLife {

public static void main(String[] args) {

new Thread(new Runnable() {

@Override

public void run() {

for(int i=0;i<5;i++){

try {

Thread.currentThread().sleep(i*10000);

System.out.println("睡了"+i*10+"秒");

} catch (InterruptedException e) {

System.out.println("干嘛吵醒我");

}

}

}

}).start();

for(int i=0;i<50;i++){

System.out.print(i);

}

}

}

观察控制台输出和任务管理器的javaw.exe会发现,当main函数的for循环打印完的时候,程序居然没有退出,而等到整个new Thread()里的匿名类的run方法执行结束后,javaw.exe才退出。

我们知道在c++的win32编程(CreatThread()),main函数执行完了,寄宿线程也跟着退出了,在c#中如果你用线程池(ThreadPool)的话,结论也是如此,线程都跟着宿主进程的结束而结束。但是在java中貌似和我们的认知有很大的出入,这是为什么呢?

这是由于java的虚拟机种有两种线程,一种叫叫守护线程,一种叫非守护线程,main函数就是个非守护线程,虚拟机的gc就是一个守护线程。java的虚拟机中,只要有任何非守护线程还没有结束,java虚拟机的实例都不会退出,所以即使main函数这个非守护线程退出,但是由于在main函数中启动的匿名线程也是非守护线程,它还没有结束,所以jvm没办法退出。

java虚拟机的生命周期,当一个java应用main函数启动时虚拟机也同时被启动,而只有当在虚拟机实例中的所有非守护进程都结束时,java虚拟机实例才结束生命。

java虚拟机的生命周期_深入理解Java虚拟机——JVM的生命周期相关推荐

  1. java方法区内存泄露_深入理解java虚拟机-第二章:java内存区域与内存泄露异常...

    2.1概述: java将内存的管理(主要是回收工作),交由jvm管理,确实很省事,但是一点jvm因内存出现问题,排查起来将会很困难,为了能够成为独当一面的大牛呢,自然要了解vm是怎么去使用内存的. 2 ...

  2. 深入java虚拟机 第四版_深入理解Java虚拟机-常用vm参数分析

    Java虚拟机深入理解系列全部文章更新中... https://blog.ouyangsihai.cn/shen-ru-li-jie-java-xu-ni-ji-java-nei-cun-qu-yu- ...

  3. java spring boot 注解验证_如何理解Java原生注解和Spring 各种注解?

    作者:digdeep .cnblogs.com/digdeep/p/4525567.html 导引 Spring中的注解大概可以分为两大类: spring的bean容器相关的注解,或者说bean工厂相 ...

  4. java中io是什么_深入理解Java中的IO

    深入理解Java中的IO 转载自:http://blog.csdn.net/qq_25184739/article/details/51205186 本文的目录视图如下: Java IO概要 a.Ja ...

  5. java如果不使用多态_深入理解java多态没有烤山药的存在,java就不香了吗?

    @ 我不想知道各位理解java多态没有烤山药的存在,java香不香的问题了,我不要你们认为,我只要我觉得 (感觉要被打....) 在博主认为多态绝对是面向对象的第三大特性中让很多小白同学以及初学者难以 ...

  6. java对象的访问定位_深入理解java虚拟机---对象的访问定位(十)

    引用其他人的文章: https://www.cnblogs.com/YYfish/p/6722258.html 那是怎么访问对象呢? java 程序是通过栈上的reference数据来操作堆上的具体对 ...

  7. java垃圾回收策论_深入理解 Java 虚拟机【3】垃圾收集策略与算法

    作者:杨立滨 链接:https://github.com/yanglbme/jvm 程序计数器.虚拟机栈.本地方法栈随线程而生,也随线程而灭:栈帧随着方法的开始而入栈,随着方法的结束而出栈.这几个区域 ...

  8. java中对象的生存期_深入理解Java虚拟机-判断对象是否存活算法与对象引用

    我们知道Java中的对象一般存放在堆中,但是总不能让这些对象一直占着内存空间,这些对象最终都会被回收并释放内存,那么我们如何判断对象已经成为垃圾呢?这篇文章会提出两种算法解决这个问题.另外,本文还要谈 ...

  9. java if在内存中_全面理解Java内存模型

    Java 内存模型的抽象 在 java 中,所有实例域.静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用"共享变量"这个术语代指实例域,静态域和数组元素).局部变量( ...

最新文章

  1. Linux之编辑器 vim
  2. 随机梯度下降、批量梯度下降、小批量梯度下降分类是什么?有什么区别?batch_size的选择如何实施、有什么影响?
  3. hdu5491(2015合肥网络赛H题)
  4. centos7 tomcat_centos7中利用logrotate工具切割日志,以tomcat日志为例
  5. 动态代理proxy与CGLib的区别
  6. 60usebean创建实例对象
  7. 面向对象的类测试技术研究
  8. 利用OpenCV和C++实现由RGB图像转化为灰度图,再将灰度图转化为二值图的程序
  9. Android onTouchEvent方法
  10. 关于电脑桌面图标消失并且右键无法点击的情况
  11. app账号退不出去_2021个人所得税退税时间是什么时候?还可以退吗?
  12. android q mix3,Android Q+5G 小米MIX3现场播放8K视频:画面流畅
  13. 猫有哪些比较常见的肢体语言?
  14. QEMU同步脏页原理
  15. Larval 主从读写分离配置
  16. 淘宝网nbsp;E客服帐号nbsp;登录阿里旺旺时nbsp;…
  17. 【MySql 数据库综合练习01 】
  18. java-php-python-ssm信贷管理系统计算机毕业设计
  19. CMMI-技术评审管理方案
  20. Petalinux 2019.1 工具环境搭建与安装

热门文章

  1. 网站开发流程-WEB开发的流程
  2. Hadoop使用MultipleOutputs输出多文件或者指定命名
  3. 朴素贝叶斯(Naive Bayes),“Naive”在何处?
  4. TensorFlow学习笔记(二十六)CNN的9大模型之LeNet5的原理讲解
  5. scala从集合中提取不重复的元素
  6. 推荐算法工程师成长2:排序模块
  7. 【机器学习】今天想跟大家聊聊SVM
  8. 40.Node.js Web 模块
  9. JavaScript实现按键精灵
  10. 人工智能+大数据 首个自动驾驶平台诞生