• JVM学习第一天


    1.基本概念

    JVM是可运行Java代码的假想计算机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆和一个存储方法域、JVM是运行在操作系统上的,它与硬件没有直接的交互。
    
    • 1

    2.运行过程

    我们都知道Java源文件,通过编译器,能够生产相应的.class文件,也就是字节码文件,而字节码文件又通过Java虚拟机中的解释器,编译成特定机器上的机器码。也就是如下:
    (1)Java源文件->编译器->字节码文件
    (2)字节码文件->JVM->机器码
    每一种平台的解释器是不同的,但是实现的虚拟机是相同的,这也是java能够跨平台的原因了,当一个程序从开始运行,这是虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享。
    
    • 1
    • 2
    • 3
    • 4

    3.线程

    这里所说的线程值得是程序执行过程中的一个线程实体,JVM允许一个应用并发执行多个线程。Hotspot JVM中的java线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。JAVA线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把他们分配到任何可用的cpu上。当原生线程初始化完毕,就会调用Java线程的run()方法。当线程结束时,会释放原生线程和java线程的所有资源。
    
    • 1

    Hotspot JVM后台运行的系统线程主要有下面几个:
    (1)虚拟机线程(VM thread)这个线程等待JVM到达安全点操作出现。这些操作必须要在独立的线程里面执行,因为当堆修改无法进行时,线程都需要JVM位于安全点。这些操作的类型有:stop-the-world垃圾回收、线程栈dump、线程暂停、线程偏向锁(biased locking)解除。
    (2)周期性任务线程:这线程负责定时器事件(也就是中断),用来调度周期性操作的执行。
    (3)GC线程:这些线程支持JVM中不同的垃圾回收活动。
    (4)编译器线程:这些线程在运行时将字节码动态编译成本地平台相关的机器码。
    (5)信号分发线程:这个线程接受发送到JVM的信号并调用适当的JVM方法处理。

    JVM内存区域

    JVM内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA堆、方法区】、直接内存。
    线程私有数据区域生命周期与线程相同,依赖用户线程的启动/结束而创建/销毁(Hotspot VM内,每个线程都与操作系统的本地线程直接映射,因此这部分内存区域的存/否跟随本地线程的生/死对应)。
    线程共享区域岁虚拟机的启动/关闭而创建/销毁。
    直接内存并不是JVM运行时数据区的一部分。

    程序计数器(线程私有)

    一块较小的内存空间,是当前线程所执行的字节码的行号指示器,每条线程都有一个独立的程序计数器,这类内存也被称为线程私有的内存。
    正在执行java方法的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。如果还是Nativa方法,则为空。
    这个内存区域是唯一一个在虚拟机中没有规定任何OutOfMemoryError情况的区域。

  • 相关阅读:
    MYSQL数据库-基础概念
    [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
    如何使用 PHP PDO 计算 MySQL 表中的行数
    Nacos源码系列—关于服务注册的那些事
    Hudi Spark SQL源码学习总结-select(查询)
    平面扫描(Plane-sweeping)深度体会
    【考研复试】计算机专业考研复试英语常见问题五(兴趣爱好/实践经历篇)
    面向对象编程的六大原则
    聊聊秒杀系统的设计(四)
    Chrome浏览器插件开发v3版本第二篇:改变页面布局案例
  • 原文地址:https://blog.csdn.net/weixin_49131718/article/details/125509223