zoukankan      html  css  js  c++  java
  • Java虚拟机JVM相关知识整理

    Java虚拟机JVM的作用:

    Java源文件(.java)通过编译器编译成.class文件,.class文件通过JVM中的解释器解释成特定机器上的机器代码,从而实现Java语言的跨平台。

    JVM的体系结构包含三个主要的子系统和一个内存区,分别是:

    • 类装载子系统:定位及导入二进制class文件,校验被导入类的正确性,为类变量分配初始化内存,以及帮助解析符号引用。
    • 执行引擎:执行被转载类中的方法指令。
    • 自动内存管理:用于管理运行时数据区的分配和释放。
    • 本地方法和库:JNI,调用本地方法,c/c++库;执行引擎所需的本地方法库。
    • 运行时数据区:又叫做虚拟机内存或Java内存。其中又分为多个小区,包括:
      • 程序计数器,JVM规范中定义每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,即所谓的当前方法,程序计数器用于存储当前线程正在执行的Java方法的JVM指令地址
      • Java虚拟机栈,每个线程在创建是都会创建一个虚拟机栈,其内部保存一个个栈帧,对应一次次Java方法调用。栈中存放基础数据类型和自定义对象的引用
      • 堆,是Java内存管理的核心区域,用于存放对象实例,堆被所有线程共享,堆内空间会被不同的垃圾回收器进行进一步细分,比如新生代、老年代
      • 方法区,用于存储元数据,比如类结构信息,以及对应的运行时常量池、字段、方法代码
      • 本地方法栈,与Java虚拟机栈类似,用于支持对本地方法的调用,每个线程都会创建一个。  

    整体结构如下图所示:

    更详细的运行时数据区如下图所示:

      从上图可以看出一个线程中包含程序计数器、Java虚拟机栈,本地方法栈,其是私有的,堆和方法区是共享的,堆中可划分为新生代区、老年代区等,方法区中包含了运行时常量池。 

       Java对象是否都分配在堆上?
      答:是的,虽然通过逃逸分析,JVM会在栈上分配哪些不会逃逸的对象,这在理论上是可行的,但是这完全取决于JVM设计者的选择,而最常用的Oracle hotspot JVM并未这么做,所有可以明确所有的对象实例都是创建在堆上的

      堆内存不足,会抛出java.lang.OutOfMemoryError:java heap space错误,可能原因是内存泄漏问题,也有可能是堆大小设定不合理
      栈内存不足,会抛出java.lang.StackOverFlowError错误,可能原因执行了一段死循环的调用代码

      Jconsole可对运行在Java应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面。它是JDK字段的监控工具,可在JDK/bin目录下找到

      Java常见的垃圾回收器有哪些?
      垃圾回收器是和具体JVM实现紧密相关的,不同的厂商(IBM、Oracle),不同版本的JVM提供的选择也不同,以主流Oracle JDK分析,主要包括:
      ①、Serial GC,串行运行;作用于新生代;复制算法;响应速度优先;适用于单CPU环境下的client模式。
      ②、PerNew GC,并行运行;作用于新生代;复制算法;响应速度优先;适用于多CPU环节Server模式下与CMS配合使用
      ③、Parallel GC,并行运行;作用于新生代;复制算法;吞吐量优先;适用于后台运算而不需要太多交互的场景。
      ④、Serial Old GC:串行运行;作用于老年代;标记-整理算法;响应速度优先;单CPU环境下的Client模式。
      ⑤、Parallel Old GC:并行运行;作用于老年代;标记-整理算法;吞吐量优先,适用于后台运算而不需要太多交互的场景。
      ⑥、CMS GC,并行运行;作用于老年代;标记-清除算法;响应速度优先,存在内存碎片化问题,适用于互联网或者B/S业务
      ⑦、G1 GC,并行运行;作用于新生代或者老年代;标记-整理算法+复制算法;响应速度优先,是一种兼顾吞吐量和停顿时间的GC实现,JDK 9以后的默认GC选择,其内存结构类似棋盘的一个个region,region之间是复制算法,但整体上实际可以看做标记--整理算法,可以有效避免内存碎片,当Java堆非常大的时候,G1更有优势,适用于服务端应用

  • 相关阅读:
    xunjian.sh
    192.168.50.235配置
    自动备份并删除旧日志
    bg和fg命令
    linux之sed用法
    正则表示第二行,第二列
    linux下redis安装
    Hma梳理
    linux 系统监控、诊断工具之 lsof 用法简介
    java的基本数据类型有八种
  • 原文地址:https://www.cnblogs.com/conswin/p/10373239.html
Copyright © 2011-2022 走看看