深入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概述的更多相关文章
- JVM的GC概述
JVM的GC概述 GC即垃圾回收,是指jvm用于释放那些不再使用的对象所占用的内存.在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能. 有些垃圾收集专用于特殊的应用程序.比如,实时应用程序 ...
- JVM(二):Java中的语法糖
JVM(二):Java中的语法糖 上文讲到在语义分析中会对Java中的语法糖进行解糖操作,因此本文就主要讲述一下Java中有哪些语法糖,每个语法糖在解糖过后的原始代码,以及这些语法糖背后的逻辑. 语法 ...
- [转帖]Java虚拟机(JVM)体系结构概述及各种性能参数优化总结
Java虚拟机(JVM)体系结构概述及各种性能参数优化总结 2014年09月11日 23:05:27 zhongwen7710 阅读数 1437 标签: JVM调优jvm 更多 个人分类: Java知 ...
- 一步步优化JVM二:JVM部署模型和JVM Runtime
选择JVM部署模型 JVM部署模型的选择总体来说就是决定应用是部署在单个JVM实例还是多个JVM实例上(这里简单举例说明一下JVM实例,比如:我们常用eclipse开发,启动一个eclipse就 ...
- Java内存管理-初始JVM和JVM启动流程(二)
勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇分享了什么是程序,以及Java程序运行的三个阶段.也顺便提到了Java中比较重要 ...
- [转帖]JVM总结--JVM体系结构
JVM总结--JVM体系结构 https://blog.csdn.net/samjustin1/article/details/52215274 需要不断的学习才可以. 2016年08月15日 22: ...
- JVM初探 -JVM内存模型
JVM初探 -JVM内存模型 标签 : JVM JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时 ...
- JVM(一)JVM的基本结构
JVM基本结构 一 JVM基本结构示意图 二 JVM结构详解 一 程序计数器 程序计数器是一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,如果线程执行的是一个Java方法,这个计数器记录的 ...
- JVM虚拟机—JVM内存
JVM在运行时将数据划分为了5个区域来存储,这5个区域图示如下: 其中方法区和堆对是所有线程共享的内存区域:而java栈.本地方法栈和程序员计数器是运行时线程私有的内存区域. 首先我们熟悉一下一个 J ...
- JVM之JVM的体系结构
一.JDK的组成 JDK:JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品.JDK中包含JRE(在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin ...
随机推荐
- Python中的简单实现UDP协议没有粘包问题
服务端: import socket server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #数据报协议->udp server.bind ...
- DOTA轮播
原文:DOTA轮播 本人录制技术视频地址:https://edu.csdn.net/lecturer/1899 欢迎观看. 这一节介绍一下Dota轮播,先看看最终效果图. 一.HTML代码分析: &l ...
- golang gin框架 使用swagger生成api文档
github地址:https://github.com/swaggo/gin-swagger 1.下载swag $ go get -u github.com/swaggo/swag/cmd/swag ...
- Linux下的一些配置
/etc/vim/vimrc文件 set cindent set expandtab set smartindent set autoindent set nu set hls taglist安装(t ...
- ELMo解读(论文 + PyTorch源码)
ELMo的概念也是很早就出了,应该是18年初的事情了.但我仍然是后知后觉,居然还是等BERT出来很久之后,才知道有这么个东西.这两天才仔细看了下论文和源码,在这里做一些记录,如果有不详实的地方,欢迎指 ...
- H3C 数据链路层
- Linux 使用 Speedtest 测试网速
Speedtest的linux客户端是用python写的一个安装包 安装python包管理器pip yum -y install python-pip 如果提示No package python-pi ...
- POJ 1961 Period 还是next数组的含义、
题意:求所给串的前缀(包括原串)中有多少循环串(子串长度至少要是周期的两倍) 思路:还是next数组的应用问题.如果不懂next数组的话 http://www.cnblogs.com/sasuke-/ ...
- Windows Community Toolkit 3.0 新功能 在WinForms 和 WPF 使用 UWP 控件
本文告诉大家一个令人震惊的消息,Windows Community Toolkit 有一个大更新,现在的版本是 3.0 .最大的提升就是 WinForm 和 WPF 程序可以使用部分 UWP 控件. ...
- iptables典型NAT上网
一般做为NAT的计算机同时也是局域网的网关,假定该机有两块网卡eth0.eth1,eth0连接外网,IP为202.96.134.134:eth1连接局域网,IP为192.168.62.10 1. 先在 ...