文档章节

JVM基础

rock-man
 rock-man
发布于 2017/09/07 19:47
字数 2172
阅读 7
收藏 0
点赞 0
评论 0

JVM基础

什么是JVM(Java Virtual Machine)?

  直接引用《深入Java虚拟机(原书第二版)》第五章的解释:1、抽象规范;2、一个具体的实现;3、一个运行中的虚拟机实例。我的理解是:首先JVM是一份规范,由Sun公司制订(现在是Oracle公司了),然后针对这个份 规范有多种实现版本,包括Sun和其它公司,运行在操作系统上面是一个具体的实例。

为什么要了解JVM?

  如果是只是简单的实现增、删、查、改功能或者做demo,确实不需要了解JVM。如果想进一步发掘Java性能、JVM调优、安全等知识,必须了解JVM。

JVM的架构?

引用网上图片一张图片,图片源地址:https://dzone.com/articles/jvm-architecture-explained。图片是JVM的逻辑图,自上而下执行;注意顺序和箭头指向;简单来说:由类型加载器子系统,运行时数据区,即时引擎组成。

Class Loader Subsystem(类装载子系统)

类装载器子系统除了定位和导入二进制Class文件外,还必须负责验证被导入类的正确性,为类变量分配并并初始化内存,以及帮助解析符号引用。类型包括:类和接口。类装载子系统只识别Class文件,不管Class是怎么生成和创建的。因为不仅JAVA语言可以创建Class文件,还有其它语言也可以创建Class文件;其它语言创建的文件只要符合规范就可以被JVM加载、连接、初始化;

  • 装载,使用双亲委派的方式装载类。根据Class路径,查找到对应的Class文件,并导入二进制的Class数据。双亲委派的模式是Java保障安全的的一个重要方法,也是安全特性之一,可以防止恶意代码的被加载;装载的最终产品就是这个Class类的实例对象;
  • 连接,包括三个步骤:验证、准备、解析。验证:确保被导入类型的正确性。可以理解为确认类型符合Java语言的语义,并且不会危及虚拟机的完整性;根据一定规则验证导入Class文件是否符合规范,Class文件的细节是否符合规范;准备:给类变量分配内存,并设置默认值;注意:这里设置默认值是,Java类型的默认值,与代码逻辑没有关系(注意:这个阶段不会执行Java代码)。解析:类型的引用转直接引用(由于Java延迟机制,解析通会延迟到下一阶段进行即:初始化)。
  • 初始化:把类变量正确初始值。要执行JAVA代码逻辑;

在这个装载阶段,有三个点需要搞明白:双亲委派模式、类加载器的命名空间、初始化(主动初始化、被动初始化)。这需要另起一篇文章才能讲清楚,在这里只提一下;

一个Class文件必须先被装载后,才得到类型的信息,类型的信息存储于运行时的方法区中,即下面章节要介绍的内容;

Runtime Data Area(运行时数据区)

运行时数据区,包含:方法区、堆、栈、程序计数器、本地方法栈;大家即使对JVM不熟悉,也应该知道有堆的存在吧;下面我们分别看下这些都是干什么的;

  • Method Area(方法区):通过Class Loader装载后得到的类型信息均存储在方法区内,包括类型名称、类型的超类、类型的接口、类型的访问修饰符号、类型的常量池、字段信息、方法信息、方法字节码、异常表、类(静态)变量、编译时常量(使用final以及编译已知道的值初始化的类变量)等信息;实际是把Class文件映射为JVM内部的数据结构,这样JVM才使用执行Class文件逻辑;
  • Heap Area(堆):Java运行时创建的类对象和数组均存储在堆内;一个Java虚拟机实例只有一个堆,该虚拟机实现的所有线程共享堆空间。由于一个Java程序独占一个Java虚拟机实例,所以每个Java程序都有自己的堆空间;Java程序对于堆的操作是通过New关键去分配空间,但不能手动回收空间(System.gc只是建议JVM进行垃圾回收,什么时候执行由JVM决定);堆空间回收就是平时大家所理解的垃圾回收,但垃圾回收不仅限于堆,也同样适用于方法区;垃圾回收是一个很大课题,需要另起一篇介绍了;JVM的调优的重点也在堆分配和回收策略的制定;
  • Stack Area(栈):启动线程时,在栈区分配一个Java栈;局部变量和引用是存储于线程栈,所以局部变量是不存在并发的问题;
  • 程序计数器:Java程序中的每一个线程的PC寄存器,是线程启动时创建的;PC寄存器的大小是一个字长,内容总是线程下一条将被执行指令的"地址";
  • 本地方法栈:略;

运行时数据区应该是大家关注的重点,因为大部分JVM性能调优工作集中在这运行时数据区(也有部分调优的工作是执行引擎做的,所以只能说大部分),特别垃圾机制对堆、方法区的影响;另外,平时大家没有依据的增加堆内存或者栈内存,基本是都是无效的,或者是错误的;为什么这么说,需要另篇文章才说得清楚;

Execution Engine(执行引擎)

Execution Engine(执行引擎)就是行为就是执行指令集合,具体实现JVM规范定义的指令;直接和本地操作交互;执行引擎可以使用多种执行技术:解释、即时编译、自适应优化等;自适应优化是目前执行引擎使用广泛的技术。

自适应优化的虚拟机开始时候都是解释运行的,但是它会监视执行情况。它会自动识别那些是程序"热区",然后把"热区"代码编译成本地代码,非常仔细地优化这些代码,以达更好性能要求。所以平时压力测试时,要先让程序跑一会,才能达到执行引擎的正常的状态。

Java线程模型

Java虚拟机规范定义的线程模型,目标是有助于在很体系结构上都实现它,在可能的情况下使用本地线程。使用本地线程的好处就是,Java线程可以不同的处理器上并行工作。关于线程的内容也很大,这里只有备忘下,有时间另起一篇文章介绍。

  • 虚拟规范没有假设不同优先级的线程采用时间分片方式。所以在不同体系的JVM所实现的分片方式是不一样的,多线程的程序不能依赖线程优先级。
  • 虚拟机的规范中,Java的线程行为术语是通过-变量、主存、和工作内存,来定义的。所以我们上面介绍JVM没有出现过主存、工作内存的术语,是因为这是虚拟机规范的用语,具体映射到JVM时有更详细的术语和说法。但这并不是说,虚拟机规范和实现不统一,虚拟机规范只是规定虚拟机要实现的功能,并不关心虚拟机怎么实现。这是我刚开始学JVM很困惑的地方,因为网上很多都说JVM的内存模型,其实是线程模型,线程模型包含了主存和工作内存的工作方式。
  • Java虚拟机规范定义许多规则用来管理线程和主存之间的低层交互行为。基本上,管理低层的行为规则可以解读为:
  1. 把变量的值从主存拷贝到它的工作内存。
  2. 把值从它的工作内存写回主存。

与线程模型有密切关系的Java关键字volatile,感兴趣的可以自己了解下。或者回复评论,我进一步解释。因为这个与虚拟机不太相关了。

 

© 著作权归作者所有

共有 人打赏支持
rock-man
粉丝 0
博文 3
码字总数 5122
作品 0
深圳
你所需要的java提升篇大总结

java基础篇深入解析大总结 java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规则 java基础(三) 加强型for循环与Iterator java基础(四) java运算顺序的深入解析 java基础(五) Str...

sihailoveyan ⋅ 04/25 ⋅ 0

Java学习---Java简单认识

前言 小编在学习Java方面的基础知识,发现里面有很多是结合之前的语言的特点发展过来的,不同的地方是,Java有它自己的发展和特点。下面小编先简单地做一下总结,结合看过的1-2章的J2SE视频,...

m18633778874 ⋅ 04/01 ⋅ 0

学编程,学java还是大数据、android?平均月薪23k以上告诉你方向

学编程,学java还是大数据、android?有不少同学在纠结中,最近有不少初学者来问到,学习大数据,学习spark,公司主要使用那些语言编写,每听到这一个问题,起码还是很不错的,证明你已经开始...

编程南风 ⋅ 05/30 ⋅ 0

编写你的第一个HelloWorld

写在前面的话 因为Java基础是以后学习框架的基石,因此开个文集首先写写Java基础,本来想直奔基础知识的介绍,但是为了保证知识的完整性,因此从Java安装和运行“hello world”开始(虽然百度...

nanaFighting ⋅ 06/15 ⋅ 0

学习大数据需要Java基础吗?

近几年,很多人都听到过一个名词“大数据”也有一部分人选择学习了解大数据,那么大数据到底是什么,学习大数据需要有Java基础吗? 推荐一个大数据学习交流群 119599574每天晚上20:10都有一节...

大数据大咖 ⋅ 06/10 ⋅ 0

Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区 ⋅ 05/09 ⋅ 0

Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/23 ⋅ 0

《成神之路-基础篇》JVM——JVM参数及调优(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是[《成神之路系列文章》][1]的第一篇,主要是关于JVM的一些介绍。 持续更新中 JVM参数及调优 JVM实用参数系列 成为Java GC专家(5)...

⋅ 05/05 ⋅ 0

安卓开发必备知识体系:Java篇

大家好我是张拭心,自从各位朋友帮点广X开始,我发现我每天更有奔头了,走起路来也更有劲了,说啥也得更新的勤快一点。不过放心,我一定推送有价值的内容给大家,还请朋友们照旧动动手指点点...

d29h1jqy3akvx ⋅ 05/10 ⋅ 0

《成神之路-基础篇》JVM——JVM内存结构(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是《成神之路系列文章》的第一篇,主要是关于JVM的一些介绍。 持续更新中 参考文章: Java虚拟机的内存组成以及堆内存介绍 Java堆和栈...

⋅ 05/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NFS介绍 NFS服务端安装配置 NFS配置选项

NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导...

lyy549745 ⋅ 33分钟前 ⋅ 0

Spring AOP 源码分析 - 筛选合适的通知器

1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor...

java高级架构牛人 ⋅ 56分钟前 ⋅ 0

HTML-标签手册

标签 描述 <!--...--> 定义注释。 <!DOCTYPE> 定义文档类型。 <a> 定义锚。超链接 <abbr> 定义缩写。 <acronym> 定义只取首字母的缩写。 <address> 定义文档作者或拥有者的联系信息。 <apple......

ZHAO_JH ⋅ 58分钟前 ⋅ 0

SylixOS在t_main中使用硬浮点方法

问题描述 在某些使用场景中,应用程序不使用动态加载的方式执行,而是跟随BSP在 t_main 线程中启动,此时应用代码是跟随 BSP 进行编译的。由于 BSP 默认使用软浮点,所以会导致应用代码中的浮...

zhywxyy ⋅ 今天 ⋅ 0

JsBridge原理分析

看了这个Github代码 https://github.com/lzyzsd/JsBridge,想起N年前比较火的Hybrid方案,想看看现在跨平台调用实现有什么新的实现方式。代码看下来之后发现确实有点独特之处,这里先把核心的...

Kingguary ⋅ 今天 ⋅ 0

Intellij IDEA神器常用技巧五-真正常用快捷键(收藏级)

如果你觉得前面几篇博文太啰嗦,下面是博主多年使用Intellij IDEA真正常用快捷键,建议收藏!!! sout,System.out.println()快捷键 fori,for循环快捷键 psvm,main方法快捷键 Alt+Home,导...

Mkeeper ⋅ 今天 ⋅ 0

Java 静态代码分析工具简要分析与使用

本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,...

Oo若离oO ⋅ 今天 ⋅ 0

SpringBoot自动配置小记

spring-boot项目的特色就在于它的自动配置,自动配置就是开箱即用的本源。 不过支持一个子项目的自动配置,往往比较复杂,无论是sping自己的项目,还是第三方的,都是如此。刚接触会有点乱乱...

大_于 ⋅ 今天 ⋅ 0

React jsx 中写更优雅、直观的条件运算符

在这篇文字中我学到了很多知识,同时结合工作中的一些经验也在思考一些东西。比如条件运算符 Conditional Operator condition ? expr_if_true : expr_if_false 在jsx中书写条件语句我们经常都...

开源中国最帅没有之一 ⋅ 今天 ⋅ 0

vim编辑模式与命令模式

5.5 进入编辑模式 从编辑模式返回一般模式“Esc” 5.6 vim命令模式 命令 :“nohl”=no high light 无高亮,取消内容中高亮标记 "x":保存退出,和wq的区别是,当进入一个文件未进行编辑时,使...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部