• 什么是jvm


    8b8d735ff43a400cbfe5082785f9efa3.jpg一、初识JVM(虚拟机)

     

      JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

     

      引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

     

    二、Java为什么是“平台无关的编程语言”?

    Java虚拟机是一个可以执行Java字节码的虚拟机进程。

    Java源文件被编译成能被Java虚拟机执行的字节码文件(.class文件)。

    Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。

    Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

    三、Java内存结构

     

     

    线程共享:方法区、堆

    线程私有:java栈、本地方法栈、程序计数器

    Java堆(Heap)

      是Java虚拟机所管理的内存中最大的一块,在虚拟机启动时创建。线程共享,此内存区域的唯一目的就是存放对象实例。

     

    方法区(Method Area)

      线程共享,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

     

    程序计数器(Program Counter Register)

      线程私有,是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。

     

    JVM栈(JVM Stacks)

      线程私有,生命周期与线程相同。

     

      虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

     

    本地方法栈(Native Method Stacks)

      线程私有,与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。

     

    PS: Native Method就是一个java调用非java代码的接口

     

    简要概括

    堆【线程共享】 :对象实例

    方法区【线程共享】 :类信息、常量、静态变量、编译后的代码

    栈 :局部变量、操作栈、动态链接、方法出口

    程序计数器 :字节码的行号指示器

    本地方法栈 :JVM使用到的native方法服务(java调用非java代码的接口)

    四、JVM的对象分配规则

    对象优先分配在Eden区【使用空间】,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC【垃圾回收】。

    大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。

    长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC(年轻代收集)那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,直到达到阀值对象进入老年区。

    动态判断对象的年龄。如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。

    空间分配担保。每次进行Minor GC时,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次Full GC,如果小于检查HandlePromotionFailure设置,如果true则只进行Monitor GC,如果false则进行Full GC。

    简要概括如下

    对象先在Eden区,Eden区空间不够时进行新生代GC

    大对象和长期存活的对象进入老年代

    JVM为每个对象设置了计数器,经过1次新生代GC则进入幸存者区,达到年龄阈值则进入老年区

    幸存者区中年龄一致的对象所占内存大小,大于幸存者区空间一半时,则大于等于此年龄的对象全部进入老年代

    老年代GC通常伴随着一次新生代GC,但不绝对

    术语说明

    Young Generation(新生代):分为:Eden区和Survivor区,Survivor区有分为大小相等的From Space和To Space。

    Old Generation(老年代): Tenured区,当 Tenured区空间不够时, JVM 会在Tenured区进行 major collection。

    Minor GC:新生代GC,指发生在新生代的垃圾收集动作,因为java对象大多都具备朝生夕死的特性,所以Minor GC非常频繁,一般回收速度也比较快。

    Major GC:发生老年代的GC,对整个堆进行GC。出现Major GC,经常会伴随至少一次Minor GC(非绝对)。MajorGC的速度一般比minor GC慢10倍以上。

    Full GC:整个虚拟机,包括永久区、新生区和老年区的回收。

  • 相关阅读:
    NPDP认证|传统行业产品经理如何把控产品方向?
    ES6 入门教程 29 ArrayBuffer 29.3 复合视图 & 29.4 DataView 视图 & 29.5 二进制数组的应用
    Modbus动态链接库供多语言使用 | Go
    HashMap
    ARTS打卡第四周之删除链表倒数第几个节点、gdb start命令、扩散模型、如何学习分享
    安捷伦E9300A射频传感器E9300B
    Mysql连接池详解——原理部分
    2022年亚太杯APMCM数学建模大赛A题结晶器熔剂熔融结晶过程序列图像特征提取及建模分析求解全过程文档及程序
    读书笔记:Java8 Streams用法总结大全 之 Stream中的常见操作
    【JavaScript】生成 [x, y]之间的随机整数
  • 原文地址:https://blog.csdn.net/weixin_57763462/article/details/132643894