当前位置: 首页 > 编程日记 > 正文

JVM——Java虚拟机架构

Java虚拟机(Java virtualmachine)实现了Java语言最重要的特征:即平台无关性。

平台无关性原理:编译后的 Java程序(.class文件)由 JVM执行。JVM屏蔽了与具体平台相关的信息,使程序可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。因此实现Java平台无关性。

本文主要介绍JVM中的架构知识,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/51404589

1. JVM结构图

JVM = 类加载器 classloader+ 执行引擎 executionengine + 运行时数据区域 runtime data area

首先Java源代码文件被Java编译器编译为字节码文件,然后JVM中的类加载器加载完毕之后,交由JVM执行引擎执行。在整个程序执行过程中,JVM中的运行时数据区(内存)会用来存储程序执行期间需要用到的数据和相关信息。

因此,在Java中我们常常说到的内存管理就是针对这段空间进行管理(如何分配和回收内存空间)。

2. ClassLoader

classloader把硬盘上的class文件加载到JVM中的运行时数据区域,但是它不负责这个类文件能否执行,而这个是执行引擎负责的。

限于篇幅,类加载器的组织结构,加载类的机制原理等会在JVM——类加载器总结一文中描述。

双亲委派模型以及自定义类加载器会在JVM——自定义类加载器一文中描述。

3. 执行引擎

作用:执行字节码,或者执行本地方法。

4. Runtime DataArea

JVM在运行期间,在运行时数据区对JVM内存空间的划分和分配,划分为了以下几个区域来存储。

(图注:JDK1.7已经把常量池转移到堆里面了!)

PC计数器(The pc Register)

(1)每一个Java线程都有一个PC寄存器,用以记录比如在线程切换回来后恢复到正确的执行位置。

(2)如该线程正在执行一个Java方法,则计数器记录的是正在执行的虚拟机字节码地址,如执行native方法,则计数器值为空。

(3)此内存区域是唯一一个在JVM中没有规定任何OutOfMemoryError情况的区域。

JVM栈(Java Virtual MachineStacks)

(1)JVM栈是线程私有的,并且生命周期与线程相同。并且当线程运行完毕后,相应内存也就被自动回收。

(2)栈里面存放的元素叫栈帧,每个方法从调用到执行结束,其实是对应一个栈帧的入栈和出栈。

栈帧用于存储执行方法时的一些数据,如局部变量表、操作数栈(执行引擎计算时需要),方法出口等等。

(3)这个区域可能有两种异常:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常(如:将一个函数反复递归自己,最终会出现这种异常)。如果JVM栈可以动态扩展(大部分JVM是可以的),当扩展时无法申请到足够内存则抛出OutOfMemoryError异常。

本地方法栈(Native Method Stacks)

(1)本地方法栈与虚拟机栈所发挥的作用很相似,他们的区别在于虚拟机栈为执行Java代码方法服务,而本地方法栈是为Native方法服务。

(2)和JVM栈一样,这个区域也会抛出StackOverflowError和OutOfMemoryError异常。

方法区(Method Area)

(1)方法区域是全局共享的,比如每个线程都可以访问同一个类的静态变量。在方法区中,存储了已被JVM加载的类的信息、静态变量、编译器编译后的代码等。如,当程序中通过getName、isInterface等方法来获取信息时,这些数据来源于方法区。

(2)由于使用反射机制的原因,虚拟机很难推测哪个类信息不再使用,因此这块区域的回收很难!另外,对这块区域主要是针对常量池回收,值得注意的是JDK1.7已经把常量池转移到堆里面了。

(3)同样,当方法区无法满足内存分配需求时,会抛出OutOfMemoryError。

运行时常量池(Runtime Constant Pool)

(1)存放类中固定的常量信息、方法引用信息等,其空间从方法区域(JDK1.7后为堆空间)中分配。

(2)Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有就是常量表,用于存放编译期已可知的常量,这部分内容将在类加载后进入方法区(永久代)存放。但是Java语言并不要求常量一定只有编译期预置入Class的常量表的内容才能进入方法区常量池,运行期间也可将新内容放入常量池(最典型的String.intern()方法)。

(3)当常量池无法在申请到内存时会抛出OutOfMemoryError异常,上面也分析过了。

Java堆

(1)Java堆是JVM所管理的最大的一块内存。它是被所有线程共享的一块内存区域,在虚拟机启动时创建。

(2)几乎所有的实例对象都是在这块区域中存放。(JIT编译器貌似不是这样的)。

(3)Java堆是垃圾收集管理的主要战场。所有Java堆可以细分为:新生代和老年代。再细致分就是把新生代分为:Eden空间、FromSurvivor空间、To Survivor空间。

(4)根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。

如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

5. 堆和栈的区别

这是一个非常常见的面试题,主要从以下几个方面来回答。

(1)各司其职

最主要的区别就是栈内存用来存储局部变量和方法调用信息。
而堆内存用来存储Java中的对象。无论是成员变量、局部变量还是类变量,它们指向的对象都存储在堆内存中。

(2)空间大小

栈的内存要远远小于堆内存,如果你使用递归的话,那么你的栈很快就会充满并产生StackOverFlowError。

(3)独有还是共享

栈内存归属于线程的私有内存,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见。
而堆内存中的对象对所有线程可见,可以被所有线程访问。

(4)异常错误

如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。

如果JVM栈可以动态扩展(大部分JVM是可以的),当扩展时无法申请到足够内存则抛出OutOfMemoryError异常。

而堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。

以上便是关于JVM架构的相关知识。

转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/51404589

转载于:https://www.cnblogs.com/jswang/p/9056441.html

相关文章:

深入理解PHP之数组遍历

本文地址: http://www.laruence.com/2009/08/23/1065.html 经常会有人问我, PHP的数组, 如果用foreach来访问, 遍历的顺序是固定的么? 以什么顺序遍历呢? 比如: <?php$arr[laruence] huixinchen;$arr[yahoo] 2007;$arr[baidu] 2008;foreach ($arr as $key >…

Github 年度最受欢迎的 TOP30 Python 项目,超值

作者 | 俊欣来源 | 关于数据分析与可视化今天小编整理归纳了2021年Github上面最受欢迎的30个Python项目&#xff0c;帮助大家在打磨技术与提升自我上面更进一步。通过代码来获取Github官网有开源的接口&#xff0c;因此数据的获取也就方便了许多&#xff0c;代码如下url https…

Linux字符设备驱动程序的框架(新写法)

这是老版本内核的的Linux驱动注册函数写法&#xff1a; major register_chrdev(0, "hello", &hello_fops); /* (major, 0), (major, 1), ..., (major, 255)都对应hello_fops */ 新版本内核Linux驱动注册函数写法#define MAJOR(devid) ((unsigned int) ((devid…

将一个普通的java项目转化为maven项目

在学习Spring事务时&#xff0c;我参考的书的源码不是maven项目&#xff0c;整本书依赖的100多个jar包都在一个文件夹里&#xff0c;我本来对spring每个模块的学习源码都放在一个Github仓库里&#xff0c;每一个项目都是maven项目&#xff0c;这样想要将项目转化为maven项目&am…

深入理解PHP内存管理之谁动了我的内存

本文地址: http://www.laruence.com/2011/03/04/1894.html转载请注明出处首先让我们看一个问题: 如下代码的输出, var_dump(memory_get_usage());$a "laruence";var_dump(memory_get_usage());unset($a);var_dump(memory_get_usage()); 输出(在我的个人电脑上, 可能…

蓝懿教育九月二十七日记录

将VIew移动做成动画效果 这种动画效果没有中间的位移可以添加动画的View属性center&#xff0c;frame&#xff0c;alpha&#xff0c;transform , backgroundColor//继续做消失的动画[UIView animateWithDuration:1 animations:^{iv.alpha 0;} completion:^(BOOL finished) …

新年快到了,让我们一起用 Python 编织中国结吧

作者 | FrigidWinter来源 | CSDN博客新年快到了&#xff0c;今天博主教大家用Python编织中国结~中国结的组成部分中国结是一种手工编织工艺品&#xff0c;它身上所显示的情致与智慧正是汉族古老文明中的一个侧面。因为其外观对称精致&#xff0c;可以代表汉族悠久的历史&#x…

pwa+webpack,初探与踩坑

0.前言 我们都知道pwa是一个新技术.&#xff0c;依靠缓存&#xff0c;离线了还能正常跑&#xff0c;而且秒开。我把以前原生写的小游戏迁移到react&#xff0c;再迁移到webpackreact&#xff0c;最后再升级到pwa。具体介绍不多说&#xff0c;我们开始撸吧。 1.webpack webpack攻…

linux sar 命令详解

sar&#xff08;System Activity Reporter系统活动情况报告&#xff09;是目前 Linux 上最为全面的系统性能分析工具之一&#xff0c;可以从多方面对系统的活动进行报告&#xff0c;包括&#xff1a;文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程…

PHP底层工作原理

简介 先看看下面这个过程&#xff1a; 我们从未手动开启过PHP的相关进程&#xff0c;它是随着Apache的启动而运行的&#xff1b;PHP通过mod_php5.so模块和Apache相连&#xff08;具体说来是SAPI&#xff0c;即服务器应用程序编程接口&#xff09;&#xff1b;PHP总共有三个模…

使用 Pandas、Jinja 和 WeasyPrint,轻松创建一个 PDF 报表

作者 |周萝卜来源 |萝卜大杂烩我们都知道&#xff0c;Pandas 擅长处理大量数据并以多种文本和视觉表示形式对其进行总结&#xff0c;它支持将结构输出到 CSV、Excel、HTML、json 等。但是如果我们想将多条数据合并到一个文档中&#xff0c;就有些复杂了。例如&#xff0c;如果要…

通过Excel生成批量SQL语句

项目中有时会遇到这样的要求&#xff1a;用户给发过来一些数据&#xff0c;要我们直接给存放到数据库里面&#xff0c;有的是Insert&#xff0c;有的是Update等等&#xff0c;少量的数据我们可以采取最原始的办法&#xff0c;也就是在SQL里面用Insert into来实现&#xff0c;但…

抵御「黄貂鱼」攻击,谷歌使出禁用2G「大招」

整理 | 于轩 责编 | 张红月出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;你还在使用2G吗&#xff1f;相信很多人第一反应都是“怎么可能&#xff1f;”确实&#xff0c;现在绝大数人都在使用技术成熟的4G网络&#xff0c;以及更高网速的5G。但是你有注意到…

Crontab运行php脚本

首先&#xff0c;确认 PHP 可执行文件的位置 —— 对于大多数 Linux 系统&#xff0c;几乎肯定是 /usr/bin/php。如果不确定其位置&#xff0c;请在命令行中键入 which php 并查看响应内容。 其次&#xff0c;键入以下代码&#xff0c;确保将 /usr/bin/php 替换为 PHP 可执行文…

iOS原生如何加载HTML中img标签的图片

原文出自&#xff1a;iOS原生如何加载HTML中img标签的图片 前言 最近iOS App项目中使用Webview加载H5页面比较多&#xff0c;也有不少朋友经常问到这个问题&#xff0c;在这里我也学习学习如何通过iOS原生的方式来加载H5页面中的图片然后让webview显示图片。 相信有很多朋友也…

Python3 的urllib实例

在Python3中合并了 urllib 和 urllib2&#xff0c; 统一命名为 urllib 了&#xff0c;我觉得这样更加合理了。让我们可以像读取本地文件一样读取WEB上的数据。封装了一个类&#xff0c;供以后方便使用吧&#xff01;并附带有许多的应用实例。 一、封装的类 #!/usr/bin/env pyth…

Java中Filter、Servlet、Listener的学习

1、Filter的功能filter功能&#xff0c;它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chainin…

CentOS 6安装DHCP

#wget ftp://ftp.isc.org/isc/dhcp/dhcp-4.2.3/dhcp-4.2.3.tar.gz #tar xvzf dhcp-4.2.3.tar.gz# cd dhcp-4.2.3#./configure #make #make install

小米AI实验室六篇论文获ICASSP2022收录,多模态语音唤醒挑战赛夺冠

1月22日&#xff0c;全球语音、声学顶级会议ICASSP 2022公布了论文入选名单&#xff0c;小米AI实验室6篇学术论文被接收。小米“自由说”系统在MISP&#xff08;基于多模态信息的语音处理&#xff09;挑战赛中荣获多模态语音唤醒第一名和多模态语音识别第二名&#xff0c;并受邀…

React + Koa 实现服务端渲染(SSR)

⚛️React是目前前端社区最流行的UI库之一&#xff0c;它的基于组件化的开发方式极大地提升了前端开发体验&#xff0c;React通过拆分一个大的应用至一个个小的组件&#xff0c;来使得我们的代码更加的可被重用&#xff0c;以及获得更好的可维护性&#xff0c;等等还有其他很多…

11 款可替代 top 命令的工具!

‍‍作者 | JackTian来源 | 杰哥的IT之旅在 Linux 环境下 top 命令都不陌生&#xff0c;它以实时动态的方式查看系统的整体运行情况&#xff0c;综合了多方信息监测系统性能和运行信息的实用工具&#xff0c;通过 top 命令所提供的互动式界面&#xff0c;可以用热键来进行管理。…

几个重要的RFC

RFC目录 权威无须解释 http://www.ietf.org/rfc/RFC中文目录http://man.chinaunix.net/develop/rfc/default.htm几个常用的RFC参考&#xff1a; RFC1945 超文本传输协议--HTTP/1.0 RFC2616超文本传输协议--HTTP/1.1 对 RFC2068的补充RFC3920可扩展的消息和出席信息协议 (XMPP)…

iOS开发笔记-两种单例模式的写法

iOS开发笔记&#xff0d;两种单例模式的写法 单例模式是开发中最常用的写法之一&#xff0c;iOS的单例模式有两种官方写法&#xff0c;如下&#xff1a; 不使用GCD #import "ServiceManager.h"static ServiceManager *defaultManager;implementation ServiceManager(…

流式大数据处理的三种框架:Storm,Spark和Samza

2019独角兽企业重金招聘Python工程师标准>>> 许多分布式计算系统都可以实时或接近实时地处理大数据流。本文将对三种Apache框架分别进行简单介绍&#xff0c;然后尝试快速、高度概述其异同。 Apache Storm 在Storm中&#xff0c;先要设计一个用于实时计算的图状结构…

CentOS用yum安装X Window

安装X图形界面系统yum list 列出所有可安装的软件包 可以通过 yum grouplist 来查看可能批量安装哪些列表 先装X windows #yum groupinstall X Window System -y 安装GNOME桌面环境#yum groupinstall GNOME Desktop Environment -y 安装KDE桌面环境#yum groupinstall KDE (K D…

Oracle VDI 安装

为什么80%的码农都做不了架构师&#xff1f;>>> 你可以在这里找到本文的原文。 虽然说Oracle已经停止了VDI的开发&#xff0c;之后支持服务业很快停止了。但是&#xff0c;作为经典的桌面虚拟化产品&#xff0c;还是值得研究一番。虽然Oracle VDI的文档已经写的很详…

Python 写了一个网页版的「P图软件」,惊呆了!

作者 | 小欣来源 | Python爱好者集中营今天是开工第一天&#xff0c;这篇文章可以算作是虎年的第一篇干货技术类文章了&#xff0c;今天小编用Python做了一个网页版的“P图软件”&#xff0c;大致的流程在于我们可以将上传的照片进行黑白处理、铅笔素描处理、模糊化处理等一系列…

Template mode HTML5 has not been configured

#thymeleafspring.thymeleaf.prefixclasspath:/templates/spring.thymeleaf.suffix.htmlspring.thymeleaf.cachefalsespring.thymeleaf.content-typetext/htmlspring.thymeleaf.enabledtruespring.thymeleaf.encodingUTF-8spring.thymeleaf.modeHTML5 解决办法&#xff1a;注释…

Java数据结构与算法(第四章栈和队列)

2019独角兽企业重金招聘Python工程师标准>>> 本章涉及的三种数据存储类型&#xff1a;栈、队列和优先级队列。 不同类型的结构 程序员的工具 数组是已经介绍过的数据存储结构&#xff0c;和其他结构&#xff08;链表、树等等&#xff09;一样&#xff0c;都适用于数…

可构建AI的「AI」诞生:几分之一秒内,就能预测新网络的参数

‍‍来源 | 学术头条人工智能在很大程度上是一场数字游戏。当深度神经网络在 10 年前开始超越传统算法&#xff0c;是因为我们终于有了足够的数据和处理能力来充分利用它们。今天的神经网络更依赖于数据和算力。训练网络时&#xff0c;需要仔细调整表征网络的数百万甚至数十亿参…