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. 初始化Redis密码

    在配置文件/etc/redis/redis.conf中有个参数: requirepass 这个就是配置redis访问密码的参数: 比如 requirepass test123: (需重启Redis才能 ...

  3. poj 2342 hdu 1520【树形dp】

    poj 2342 给出每个顶点的happy值,还有若干组两个顶点L,K关系,表示K是L的上司.求当K.L不同时出现时获得的happy值的最大和. 设dp[u][0]表示不选u结点时获得的最大值,dp[ ...

  4. SDUT-1479_数据结构实验之栈与队列九:行编辑器

    数据结构实验之栈与队列九:行编辑器 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个简单的行编辑程序的功能是:接受用 ...

  5. IoT SaaS加速器——助力阿尔茨海默病人护理

    场景介绍 阿尔茨海默病,是导致中老年人认知功能障碍的最常见疾病之一,是发生在老年期及老年前期的一种原发性退行性脑病.据估计,全世界痴呆症患者数量为4700万,到2030年将达到7500万人.痴呆症患者 ...

  6. P2P需集齐四大证照

    今后做P2P需集齐四大证照 比牌照制还严 2016-09-05 11:53:24 分类:热点观察 作者:汪祖刚 8月24日,P2P网贷监管细则在千呼万唤中始出来,整个行业内外的关注热度可谓史无前例.有 ...

  7. C函数和宏中的可变参数

    一:调用惯例 函数的调用方和被调用方对函数如何调用应该有统一的理解,否则函数就无法正确调用.比如foo(int n, int m),调用方如果认为压栈顺序是m,n,而foo认为压栈顺序是n, m,那么 ...

  8. Python深入:修改Python搜索路径

    当Python执行import语句时,它会在一些路径中搜索Python模块和扩展模块.可以通过sys.path查看这些路径,比如: >>> import sys >>&g ...

  9. 解锁当前XXX用户

    pam_tally2 查看当前锁账户 pam_tally2 --user=XXX用户 --reset 解锁当前XXX用户

  10. iptables 伪装(Masquerading)

    「偽装」是一种特殊的SNAT操作:将来自其它电脑的包的来源位址改成自己的位址:请注意,由於入替的来源位址是自动決定的(执行SNAT的主机的IP位址).所以,如果它改变了,仍在持续中的旧连線将会失效.「 ...