JVM的生命周期

JVM的生命周期

虚拟机的启动 —> 虚拟机的执行 —> 虚拟机的退出

虚拟机的启动:

Java虚拟机的启动是通过引导类加载器(bootstrap classLoader)创建一个初始类(initial Class)来完成的, 这个类是由具体的虚拟机的实现来决定的(也就是不同的虚拟机这个初始化类也是不同的)

  • 假设我们创建了一个自定义类, 其中有一个main()方法, 当我们执行该main()方法的时候首先要加载该main()方法所在的类, 而加载该类前要加载其父类object, 而其实在底层最初加载的类并不是object, 实际上加载一个类的时候即使这个类没有继承关系, 但是也会同时加载很多的其他类, 其中就包括了Object类, 注意: 这些加载的其他类中包括Object类都是一些官方的API, 所以都是使用引导类加载器来加载的
    • 引导类加载器又称之为: 根类加载器

虚拟机的执行:

  • 一个运行中的Java虚拟机有着一个清晰的任务: 执行Java程序
  • 程序开始执行时JVM才运行, 程序结束时JVM也就会停止
  • 执行一个所谓的Java程序的时候, 真真正正在执行的是一个叫做Java虚拟机的进程
    • 一个Java虚拟机就是一个运行中的程序, 也就是一个进程
      • 如果我们同时一台电脑上面运行了三个Java程序, 那么此时就有三个Java虚拟机正在运行
      • Java虚拟机也是一个软件, 一个程序, 一个进程
  • 在终端(Terminal)中输入jps, 打印当前程序执行中的进程

虚拟机的退出:

  1. 程序正常执行结束
  2. 程序在执行过程中遇到异常或者是错误而异常终止
  3. 由于操作系统出现错误而导致Java虚拟机进程终止
  4. 某线程调用Runtime类或者是System类中的exit()方法, 或者Runtime类中的halt()方法, 并且Java安全管理器也是允许这次exit或者是halt操作(也就是要有足够的权限)
    • Runtime类是一个饿汉式的单例类, 因为一个Runtime类的实例对应JVM中的运行时数据区(Runtime Data Area), 而一个JVM中只有一个运行时数据区, 那么也就是一个JVM进程中只会有一个Runtime类的实例
    • System类中的静态exit()方法调用了Runtime类中的非静态exit()方法, 而Runtime类中的exit()方法有调用了Runtime类中的halt()方法, 而Runtime类中的halt()方法又调用了Shutdown类中的halt()方法, 然后Shutdown类中的halt()方法又调用了本地的halt()方法
  5. 除此以外, JNI(Java本地接口规范, Java Native Interface)规范描述了用JNI Invocation API来加载或者卸载JVM时, JVM的退出情况
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值