【JVM学习】JVM结构(二) 部分知识点简述

文章中知识点摘自/总结于尚硅谷教育《剑指JVM:虚拟机实践与性能调优》

文章如有错误or需要完善,还请指正,非常感谢!
文章参考/节选尚硅谷教育《剑指JVM:虚拟机实践与性能调优》,感兴趣的朋友可以直接阅读此书。



知识点:
  1. jvm在程序执行期间把它所管理的内存分为两种类型,
    一种是在jvm启动时创建,仅在jvm退出时销毁,线程共享。
    另一种是在创建线程时创建,退出线程时销毁,线程私有。

  2. 虚拟机栈是以栈帧为基本单位构成的,栈帧包括局部变量表、操作数栈、动态链接、方法返回地址和一些附加信息

  3. 线程私有的区域包括程序计数器、虚拟机栈、本地方法栈。
    线程共享的区域包括 堆区、方法区。

  4. Runtime类的getRuntime()方法,获取虚拟机内存信息等。

  5. Hotspot虚拟机中,每个线程与操作系统的本地线程直接映射,当一个Java线程准备好执行以后,此时这个操作系统的本地线程也会同时创建。Java线程执行终止后,本地线程也会回收。

  6. 本地线程初始化成功,就会调用java线程中的run方法。如果执行过程中出现未捕获异常,会导致Java线程终止,本地线程再决定jvm是否终止。

  7. 在HotSpot虚拟机中,常见的守护线程主要包括以下3种。

    1. 垃圾回收线程:这种线程对在JVM里不同种类的垃圾收集行为提供了支持。
    2. 编译线程:这种线程在运行时会将字节码编译成本地代码(详见解释1-3)。
    3. 手动创建守护线程:在调用start()方法前调用setDaemon(true)可以将线程标记为守护线程。
  8. Java代码执行流程,
    Java源文件.java——经过编译器的词法分析、语法分析、语义分析、字节码生成器等一系列过程生成——>.class为后缀的字节码文件——经过JVM的类加载器、字节码校验器、翻译字节码或jit编译器编译成——>机器指令——提供给操作系统、执行

  9. jdk1.0时,java是解释型语言。现在java更多被认为是半编译半解释型语言,Java为了解决性能问题,添加JIT即时编译技术。
    JIT将执行比较频繁的整个方法或代码快直接编译成本地机器码,后续执行该方法,直接执行生成的机器码。

  10. jit编译器中的编译功能与javac的编译功能不是同一个,javac将.java文件编译为.class字节码文件。jit将字节码文件编译为机器指令。

  11. Java编译器输入的指令流是一种基于栈的指令集架构,另一种是基于寄存器的指令集架构

    • 前者设计实现更简单,适用于简单的设备如打印机等嵌入式设备。不需要硬件支持,可移植性更好。只针对栈顶元素操作。
    • 后者指令直接由CPU执行,性能和执行更优。花费更少的指令完成一项操作。

    在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主。

  12. JVM生命周期包含,启动、执行、退出。

    1. 启动,可以通过Java命令启动,接着通过引导类加载器加载类文件,最后找到main方法,执行程序。
    2. 执行,JVM通过main方法开始执行程序,程序结束时JVM停止。执行一个Java程序,真正在执行的是一个叫JVM的进程。
    3. 退出,Java程序正常执行结束,即当所有非守护线程执行结束。
      • Java程序执行过程中遇异常。
      • 操作系统宕机。
      • 某线程调用exit方法。

解释:
  1. 本地代码为原生代码或者native代码。
  2. 原生代码为程序直接编译成单独的可执行文件(机器码),在计算机的操作系统层面执行,而不借助虚拟机。
  3. native代码是指在java中调用非java代码编写的接口。方法对应的实现是在其他语言实现的文件中。

参考链接:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值