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更有优势,适用于服务端应用

Java虚拟机JVM相关知识整理的更多相关文章

  1. 了解java虚拟机—JVM相关参数设置(2)

    1.   JVM相关参数设置 JVM相关配置 -XX:+PrintGC 两次次YoungGC,两次FullGC. -XX:+PrintGCDetails 打印GC时的内存,并且在程序结束时打印堆内存使 ...

  2. Java并发编程相关知识整理

    1.什么是进程.线程.多线程?     进程当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.进程间通讯依靠IPC资源,例如管道.套接字     线程是程序中的 ...

  3. Java集合框架相关知识整理

    1.常见的集合有哪些? Collection接口和Map接口是所有集合框架的父接口    Collection接口的子接口包括:Set接口和List接口    Map接口的实现类主要有:HashMap ...

  4. JVM相关知识

    Java虚拟机学习分享最近主要在学习JVM相关知识,-知识主要来源<深入理解JAVA虚拟机>,深有感触,结合自己的理解,整理出一些经验,由于篇幅较长,就把链接帖出来,希望对大家有所帮助: ...

  5. 深入理解java虚拟机JVM(下)

    深入理解java虚拟机JVM(下) 链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w 提取码:uwak 复制这段内容后打开百度网盘手机App,操作更 ...

  6. Java虚拟机(JVM)知多少

    本文大量参考:https://www.cnblogs.com/lfs2640666960/p/9297176.html 概述 JVM是JRE的一部分.它是一个虚构出来的计算机,是通过在实际的计算机上仿 ...

  7. 深入理解java虚拟机JVM(上)

    深入理解java虚拟机JVM(上) 链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w 提取码:uwak 复制这段内容后打开百度网盘手机App,操作更 ...

  8. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  9. Java虚拟机JVM学习03 连接过程:验证、准备、解析

    Java虚拟机JVM学习03 连接过程:验证.准备.解析 类被加载后,就进入连接阶段. 连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去. 连接阶段三个步骤:验证.准备和解析. 类 ...

随机推荐

  1. 好的封装 vs 好的复用

    好的封装 vs 好的复用好的封装 一个封装相对较好的体现和实现方式如下:内部类的方式来组织代码,不需要外面的类指导我内部的类. 好的复用一个好的复用的体现和实现方式如下:可以通过搭积木的方式来组织功能 ...

  2. python_函数式编程

    函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式).在面向过程编程中,我们见到过函数(function):在面向对象编程中,我们见过对象(object).函数和对象的根本目的是以 ...

  3. linq 表分组后关联查询

    测试linq,获取有教师名额的学校.比如学校有5个教师名额,teacher数量没超过5个,发现有空额 var query = (from teacher in _repositoryTeacher.T ...

  4. jdk1.8新特性之lambda表达式及在Android Studio中的使用举例

    Jdk1.8已经出很久了但是很多同学对它的特性在android studio 中的应用可能还不是很熟悉,今天我们就来对这个新特性在AS中做它的应用实践. 一.首先在有JDK1.8的情况下我们要在AS的 ...

  5. 浅探网络1---tcp协议详解(三次握手和四次挥手)

    TCP协议是网络多层协议中运输层的最重要的协议之一,运输层是两台主机的进程之间的通信.除了TCP还有一个是UDP协议(用户数据包协议) TCP全称是Transmission Control Proto ...

  6. Porsche Piwis Tester II V14.000 with CF30 Laptop at autonumen.com

    Porsche piwis tester ii is the latest professional tester for Porshe,the most poweful diagnose and o ...

  7. java之代码复用

    1.通用查询修改方法 2.通用查询修改方法接口

  8. 【一些容易忘记的node的npm命令】【收集】

    更新npm到最新版本 npm update -g npm 安装依赖包时命令的一些区别 npm install xxx -g //(全局安装) npm install xxx --save-dev // ...

  9. P4777 【模板】扩展中国剩余定理(EXCRT)/ poj2891 Strange Way to Express Integers

    P4777 [模板]扩展中国剩余定理(EXCRT) excrt模板 我们知道,crt无法处理模数不两两互质的情况 然鹅excrt可以 设当前解到第 i 个方程 设$M=\prod_{j=1}^{i-1 ...

  10. Shell 常见理论问答

    (1)shell脚本中,怎么可以把某一行注释掉? 答:“#”. (2)如何执行一个shell脚本呢? 答:“sh x.sh”,“加执行./x.sh”,“bash x.sh”. (3)为了方便管理我们约 ...