java虚拟机1.7_《Java虚拟机原理》7.1 精选 —— 总览

1.一个程序在 JVM 中运行的完整流程

55825d488acc

java程序执行流程.JPG

说明:

① 类加载器把字节码加载到方法区

② 方法区的字节码被 JVM new,在堆内存中生成字节码对象

③ 字节码对象被 GC 的要求有:该类没有在其他任何地方被引用;该类的所有的实例对象都已被 GC;该类的类加载器的实例已被 GC

2.Java 虚拟机的生命周期

JVM 的生命周期可以分为启动、运行、退出。

(1) 启动

JVM 的启动过程是类加载,通过类加载器把二进制字节码加载到 JVM。

类加载器采用双亲委派模型, 其类型有 3 种:

① Bootstrap ClassLoader 启动类加载器:负责加载系统类和 /lib 目录的 jar 和类,例如 String

② ExtClassLoader 扩展类加载器:负责加载 /lib/ext 目录下的 jar 和类

③ AppClassLoader 应用程序类加载器:负责加载当前应用 ClassPath 的 jar 和类

④ UserDefinedClassLoader 用户自定义加载器:负责加载用户自定义的 jar 和类

示例如下,执行 main 方法,需要加载 Test01。根据双亲委派模型即向上检查、向下加载,JVM 从 AppClassLoader、ExtClassLoader 到 Bootstrap ClassLoader 检查和加载 Test01。Test01 是用户自定义类,Test01 没有指定父类即默认父类是 Object 类,被

AppClassLoader 加载。

public class Test01 {

public static void main(String[] args) {

System.out.println("123");

}

}

类的生命周期:

① 加载:通过全类名获取该类的二进制字节流、将字节流所代表的静态存储结构转换为方法区的运行时数据结构、在内存中生成一个代表该类的 Class 对象(方法区数据的访问入口);

② 验证:验证文件格式、字节码验证、魔数验证

③ 准备:分配内存给类变量,并设置类变量初始值。如果是基本数据类型,就会给他们设置默认值;

④ 解析:将常量池内的符号引用替换为直接引用

⑤ 初始化:new 指令、getstatic 指令、putstatic 指令、invokestatic 指令、 java.lang.reflect 的反射等

⑥ 使用:用户程序使用

⑦ 卸载:该类的所有的实例对象都已被GC、该类没有在其他任何地方被引用、该类的类加载器的实例已被GC

(2) 运行

一个JVM 进程的运行,实际上是 Java 程序的运行。当程序运行结束后,JVM 进程也就结束。

JVM 的守护线程:

Java 有 2 种进程,User Thread 用户线程、Daemon Thread 守护线程。例如,用户线程是指用户自定义的 main 函数,而守护线程是服务于用户线程的,例如 GC 垃圾回收线程。两种线程的生命周期是一致的,前者优先级高于后者的。

(3)退出

JVM 的退出有多种场景,如下所示。

① 程序正常结束运行

② 程序中调用 System.exit() 等方法

③ 程序运行过程中,遇到异常错误终止

④ 操作系统、硬件原因导致 JVM 进程被结束

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
版本的区别主要体现在哪些方面? 回答: Java虚拟1.7与1.8版本在方法区和堆区有一些区别。在1.7版本中,方法区是实现方法区的一部分,使用永久代来存储,大小是固定的。而在1.8版本中,方法区被改为使用元数据区,且不再在虚拟中,而是使用本地内存,并且大小可以自动增长,减少了内存溢出的风险。另外,在堆区方面,1.7版本将运行时常量池从方法区移到了堆区,为1.8版本移出永久代做准备。此外,在扩容方式上也有不同,1.7和1.8版本都是扩容2倍,但1.8版本采用了新的计算方式,可以快速计算出扩容后的储存方式。此外,1.7版本使用头插入方法,而1.8版本采用尾插入方法,并引入了红黑树,避免了链表死循环问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【JVM】JVM 1.7与1.8版本内存结构区别](https://blog.csdn.net/xianyun1992/article/details/126555575)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [java基础 浅析MAP原理以及1.7与1.8的区别](https://blog.csdn.net/u011863822/article/details/114675455)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值