深入理解JVM运行原理(一)
一、JVM的运行机制
JVM是用于运行Java字节码的虚拟机,包括一套字节码指令集、一组程序寄存器、一个虚拟机栈、一个虚拟机堆、一个方法区和一个垃圾回收器。JVM运行在操作系统之上,不与硬件设备直接交互。
Java源文件在通过编译器之后被编译成相应的.Class文件,.Class文件又被JVM中的解释器编译成机器码在不同的操作系统(Windows、Linux、Mac)上运行。每种操作系统的解释器都是不同的,但基于解释器实现的虚拟机是相同的,这也是Java能够跨平台的原因。在一个Java进程开始运行后,虚拟机就开始实例化了,有多个进程启动就会实例化多个虚拟机实例。进程退出或者关闭,则虚拟机实例消亡,在多个虚拟机实例之间不能共享数据。
Java程序的具体运行过程如下:
(1)Java源文件被编译器编译成字节码文件。
(2)JVM将字节码文件编译成相应操作系统的机器码。
(3)机器码调用相应操作系统的本地方法库执行相应的方法。
Java虚拟机包括一个类加载器子系统、运行时数据区、执行引擎和本地接口库。本地接口库通过调用本地方法库与操作系统交互,如图所示。
其中:
- 类加载器子系统用于将编译好的.Class文件加载到JVM中;
- 运行时数据区用于存储在JVM运行过程中产生的数据,包括程序计数器、方法区、本地方法区、虚拟机栈和虚拟机堆;
- 执行引擎包括即时编译器和垃圾回收器,即时编译器用于将Java字节码编译成具体的机器码,垃圾回收器用于回收在运行过程中不再使用的对象;
- 本地接口库用于调用操作系统的本地方法库完成具体的指令操作。
二、多线程
在多核操作系统上,JVM允许在一个进程内同时并发执行多个线程。JVM中的线程与操作系统中的线程是相互对应的,在JVM线程的本地存储、缓冲区分配、同步对象、栈、程序计数器等准备工作都完成时,原生线程随之被回收。操作系统负责调度所有线程,并为其分配CPU时间片,在原生线程初始化完毕时,就会调用Java线程的run()执行该线程;在线程结束时,会释放原生线程和Java线程所对应的资源。
在JVM后台运行的线程主要有以下几个:
- 虚拟机线程:虚拟机线程在JVM到达安全点时出现。
- 周期性任务线程:通过定时器调度线程来实现周期性任务的执行。
- GC线程:GC线程支持JVM中不同的垃圾回收活动。
- 编译器线程:编译器线程在运行时将字节码动态编译成本地平台机器码,是JVM跨平台的具体实现。
- 信号分发线程:接收发送到JVM的信号并调用JVM方法。
三、JVM的内存区域
JVM的内存区域分为线程私有区域(程序计数器、虚拟机栈、本地方法区)、线程共享区域(堆、方法区)和直接内存,如图所示。
线程私有区域的生命周期与线程相同,随线程的启动而创建,随线程的结束而销毁。在JVM内部,每个线程都与操作系统的本地线程直接映射,因此线程私有内存区域的存在与否和本地线程的启动和销毁对应。
线程共享区域随虚拟机的启动而创建,随虚拟机的关闭而销毁。
直接内存也叫做堆外内存,它并不是JVM运行时数据区的一部分,但在并发编程中被频繁使用。JDK的NIO模块提供的基于Channel与Buffer的I/O操作方式就是基于堆外内存实现的,NIO模块通过调用Native函数库直接在操作系统上分配堆外内存,然后使用DirectByteBuffer对象作为这块内存的引用对内存进行操作,Java进程可以通过堆外内存技术避免在Java堆和Native堆中来回复制数据带来的资源浪费和性能消耗,因此堆外内存在高并发应用场景下被广泛使用(Netty、Flink、HBase、Hadoop都有用到堆外内存)。
深入理解JVM运行原理(一)相关推荐
- 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!
受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话:"八小时内谋生活,八小时外谋发展. ...
- 深入理解JVM底层原理——运行时数据区
运行时数据区概述和线程 1.运行时数据区概述 ! 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请 ...
- 十年架构师详解JVM运行原理
做Java开发的几乎都知JVM这个名词,但是由于JVM对实际的简单开发的来说关联的还是不多,一般工作个一两年(当然不包括爱学习的及专门做性能优化的什么的),很少有人能很好的去学习及理解什么是JVM,以 ...
- java jvm原理_JAVA和JVM运行原理
JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器.它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序. 编译器负责把Java ...
- 23.多线程(进程的概述和多进程的意义,线程的概述和多线程的意义,JVM运行原理以及JVM启动的线程探讨,实现多线程 线程调度,线程控制,Lock锁,死锁现象)
1.进程概述及多进程的意义 1.线程和进程 要想说线程,首先必须得聊聊进程,因为线程是依赖于进程存在的. 2.进程概述 什么是进程呢?通过任务管理器我们就可以看到进程的存在. ...
- 为什么jvm要分为堆、方法区等?原理是什么?_「JVM」知识点详解一:JVM运行原理详解...
前言 JVM 一直都是面试的必考点,大家都知道,但是要把它搞清楚又好像不是特别容易.JVM 的知识点太散,不系统,今天带大家详细的了解一下jvm的运行原理. 正文 1 什么是JVM? JVM是Java ...
- 深入理解jvm运行时区域
前言 最近一直在看周志明老师的<深入理解虚拟机>,总是看了忘,忘了又看,陷入这样无休止的循环当中.抱着纸上得来终觉浅的想法,准备陆续的写几篇学习笔记,梳理知识的脉络并强化一下对知识的掌握. ...
- JVM运行原理及优化之 jstat -gc
我们写好的代码,是要通过JVM才能运行的 JVM 想要执行一个类,首先要加载类,在加载类之前,需要先编译成字节码class 文件 然后就执行类的加载过程,JVM 加载类的话,需要类加载器 类加载器是分 ...
- 第1篇:JVM运行原理
文章目录 前言 一.类的生命周期 二.类加载原理 1.类加载的过程 2.代码示例 三.双亲委派原理 1.原理图 2.双亲委派的优点 四.Tomcat类加载机制 总结 前言 学习JVM,首先需要了解类的 ...
最新文章
- Ubuntu和Linux的区别
- 工作计划2017-01-03
- python 大项目使用cython_提升6.75倍!利用Cython为Python代码加速
- Python【算法中心 03】Docker部署Django搭建的Python应用流程实例(Docker离线安装配置+Django项目Docker部署)
- 用行为树的方式思考:任务系统设计
- 不属于前后端分离的Vue+Django的例子
- 2017计算机应用考研大纲,2017考研计算机大纲
- flutter 拖拽布局_使用Flutter模仿SOUL可任意拖动的悬浮按钮
- android studio防止反编译,防反编译利器-Android studio混淆代码压缩apk包体积
- 【Qt教程】2.6 - Qt5 自定义控件封装
- 『转载』看c#打印的各种技术
- linux安装向日葵命令行版
- 最强整理!Android攒了一个月的面试题及解答,震撼来袭免费下载!
- 一起学爬虫(Python) — 23 自动化详解2
- 请解释什么是事件代理
- C#高级编程——C#扩展方法+接口,定义统一的搜索接口,基于Unity(三)——图文详解加源码
- SQLiteSpy介绍和使用
- 找不到Vivado卸载程序的解决方案
- echarts 饼形图{c} 显示 [Obejct,Obejct]
- Python爬虫系列(七)豆瓣图书排行榜(数据存入到数据库)
热门文章
- 四阶龙格库塔法的基本思想_经典四阶龙格库塔法解一阶微分方程组讲义.doc
- RNAdiff 使用教程 | DEG分析、TPM计算以及火山图和热图的绘制
- ted学习方法_视世界为1000人,我是如何学习内容策略的TED设计系统的
- Python自动生成数据日报
- java正则表达式原理_Java 正则表达式详解
- 设计之美 - 设计模式学习
- 怎么转换AZW3格式?介绍几个AZW3转PDF工具给你
- linux下达梦数据库导出dmp,DM7 达梦数据库 物理备份还原之 备份管理 操作手册
- 《创业基础》项目创意设计书
- Unity 安卓AB包版本问题