1. 深入JVM(一)JVM指令手册
  2. 深入JVM(二)JVM概述

一.JVM的原理

Java虚拟机是Java平台的基石,解决了硬件和操作系统的相互独立性。不同平台(Windows,Linux和MacOS)的JVM都是不同的,但是他们都提供了相同的接口。虚拟机可以分为系统虚拟机和程序虚拟机。系统虚拟机就是VMware和VirtualBox这一类的,完全是对物理资源的隔离。而Java虚拟机是程序虚拟机,它包含了一组指令集并在运行时操作各个不同内存区域,这些指令在JVM中称为Java字节码指令。

二.JVM的结构

JVM的基本结构如下图所示:

图中的Java文件泛指所有构建在Java虚拟机上的编程语言文件,如Groovy, Scala, Kotlin等。JVM不和上述任何语言关联,而是使用javac把这些语言编译为“Class文件”的这种二进制格式。Class文件中包含了JVM指令集和符号表已经其他一些信息。

2.1 类加载子系统

负责从class字节码文件中并存放在方法区的内存中,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。

2.2 执行引擎

负责执行虚拟机的字节码,JVM制定了自己的指令集和体系结构,输入字节码文件并输出执行结果。

2.3 程序计数器

是一块较小的内存空间,可以看做是当前线程所执行的字节码行号指示器,每个线程都有一个独立的程序计数器。在虚拟机概念模型中,字节码解释器工作时就是通过改变计数器的值来选取下一条待执行的指令。当发生CPU时间片切换的时候,由程序计数器来确保当线程重新获取到CPU时间片后能够恢复到正确的执行位置。
如果当前方法是Java方法,程序计数器的值是正在执行的虚拟机字节码指令地址;如果是Native方法,则为空

2.4 虚拟机栈

是线程私有的,并与线程的生命周期相同。虚拟机栈中又会包含多个栈帧,每运行一个方法就创建一个栈帧,用于存储局部变量表、操作栈、方法返回值等。每一个方法从调用直至执行完成的过程,就对应一个栈帧在java栈中入栈到出栈的过程。
其中的局部变量表存放了各种基本数据类型,对象引用地址和returnAddress。所以局部变量表所需要的内存空间在编译期就可以完成分配。当进入到一个方法的时候,该方法所需要在栈帧中的大小是确定的,并且在运行期间不会改变

2.5 本地方法栈

本地方法栈的作用类似于虚拟机栈,只不过虚拟机栈是为执行Java方法服务,而本地方法栈则为虚拟机使用到的native方法服务

2.6 堆

堆在虚拟机启动的时候创建,是被所有线程共享的一块内存区域。几乎所有的对象都放在堆上,堆也就成为了垃圾回收的主要区域。在JDK1.8之前,堆可以分为新生代和老年代,其中新生代又可以细分为Eden,From和To三块区域。

从JDK1.8开始,永久代从堆内存中被转移到本地内存中

2.7 方法区

各个线程共享的内存区域,用于存储已经被加载的类信息、常量、静态变量、及时编译器编译后的代码等。在HotSpot虚拟机上方法区就对应上图中的永久代。该区域不需要连续的内存区域,GC回收的主要目标是针对常量池和类型的卸载。

深入JVM(二)JVM概述的更多相关文章

  1. JVM的GC概述

    JVM的GC概述 GC即垃圾回收,是指jvm用于释放那些不再使用的对象所占用的内存.在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能. 有些垃圾收集专用于特殊的应用程序.比如,实时应用程序 ...

  2. JVM(二):Java中的语法糖

    JVM(二):Java中的语法糖 上文讲到在语义分析中会对Java中的语法糖进行解糖操作,因此本文就主要讲述一下Java中有哪些语法糖,每个语法糖在解糖过后的原始代码,以及这些语法糖背后的逻辑. 语法 ...

  3. [转帖]Java虚拟机(JVM)体系结构概述及各种性能参数优化总结

    Java虚拟机(JVM)体系结构概述及各种性能参数优化总结 2014年09月11日 23:05:27 zhongwen7710 阅读数 1437 标签: JVM调优jvm 更多 个人分类: Java知 ...

  4. 一步步优化JVM二:JVM部署模型和JVM Runtime

    选择JVM部署模型    JVM部署模型的选择总体来说就是决定应用是部署在单个JVM实例还是多个JVM实例上(这里简单举例说明一下JVM实例,比如:我们常用eclipse开发,启动一个eclipse就 ...

  5. Java内存管理-初始JVM和JVM启动流程(二)

    勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇分享了什么是程序,以及Java程序运行的三个阶段.也顺便提到了Java中比较重要 ...

  6. [转帖]JVM总结--JVM体系结构

    JVM总结--JVM体系结构 https://blog.csdn.net/samjustin1/article/details/52215274 需要不断的学习才可以. 2016年08月15日 22: ...

  7. JVM初探 -JVM内存模型

    JVM初探 -JVM内存模型 标签 : JVM JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时 ...

  8. JVM(一)JVM的基本结构

    JVM基本结构 一 JVM基本结构示意图 二 JVM结构详解 一 程序计数器 程序计数器是一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,如果线程执行的是一个Java方法,这个计数器记录的 ...

  9. JVM虚拟机—JVM内存

    JVM在运行时将数据划分为了5个区域来存储,这5个区域图示如下: 其中方法区和堆对是所有线程共享的内存区域:而java栈.本地方法栈和程序员计数器是运行时线程私有的内存区域. 首先我们熟悉一下一个 J ...

  10. JVM之JVM的体系结构

    一.JDK的组成 JDK:JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品.JDK中包含JRE(在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin ...

随机推荐

  1. shell学习(19)- find查找命令

    Linux find命令用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件.并且将查找到的子目录 ...

  2. Javascript用正则表达式replace替换父串中所有符合条件的子串

    这样用,只会替换匹配到的第一个子串 str = 'I hava a pen ,I hava an apple,apple pen, pen apple' str = str.replace('appl ...

  3. 洛谷P3366 【模板】最小生成树(kuskal)

    #include<bits/stdc++.h> using namespace std; ; ; struct node{ int cnt,fa; }f[maxn]; inline voi ...

  4. HDFS 通信接口

  5. 注意 Laravel 清除缓存 php artisan cache:clear 的一个坑

    Laravel 的命令 php artisan cache:clear 用来清除各种缓存,如页面,Redis,配置文件等缓存,它会清空 Redis 数据库的全部数据,比如默认使用的 Redis 的 数 ...

  6. ipykernel_launcher.py: error: unrecognized arguments: -f /Users/apple/Library/Jupyter/runtime/kernel

    当在jupyter下使用parser.parse_args()出错则改换为parser.parse_known_args()[0]其效用是差不多的,至于为什么出现错误,我也不知道…

  7. hdu 1434 幸福列车 (Leftist Tree)

    Problem - 1434 网上题解是普通的堆合并,都是用优先队列直接做的.可是正解的堆合并应该是用左偏堆或者斐波那契堆的吧,不然O(X * N ^ 2)的复杂度应该是过不了的.斐波那契堆的实现相对 ...

  8. hdu 1277 全文检索 (直接映射查找 || 自动机)

    Problem - 1277 无聊做水题的时候发现的一道题目.这道题第一反应可以用自动机来解决.当然,条件是各种限制,从而导致可以用直接映射标记的方法来搜索.具体的做法就像RK算法一样,将字符串has ...

  9. 2013-4-3 C#中alt键不是Keys.Alt 而是 Keys.LMenu

    2013-4-3 C#中alt键不是Keys.Alt而是Keys.LMenu

  10. oracle 识别’低效执行’的SQL语句

    用下列SQL工具找出低效SQL: SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, ROUND((BUFFER_GETS-DISK_READS)/BUFFER_ ...