笔记:Java虚拟机运行时数据区

Java虚拟机在执行Java程序的过程中会把它管的内存划分为以下若干个不同的区域:

 

1、程序计数器

  程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器;由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只能执行一个线程中的指令,因此为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器来记录线程之前执行到哪里了。

  如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令地址;如果正在执行的是一个Native方法,这个计数器值则为空(Undefined)。

  这个内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

  是线程私有的内存空间。

 

2、Java虚拟机栈

  是线程私有内存空间。

  虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链表、方法的出口信息等。每一个方法从调用直到执行完成的过程,就对应这一个栈帧在虚拟机栈中的入栈和出栈。

  局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型)和returnAddress类型(指向了一条字节码指令的地址)。其中64位的long和double类型占用两个局部变量空间,其余数据类型占用1个变量空间。

  局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间是不会改变局部变量表大小的。

  在Java虚拟机规范中,这个区域规定了两种异常情况:一、如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;二、如果虚拟机可动态扩展(当前大部分虚拟机都可以动态扩展),如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

 

3、本地方法栈

  本地方法栈和Java虚拟机栈发挥的作用非常相似,Java虚拟机栈是为虚拟机执行Java方法服务的,而本地方法栈是为虚拟机使用Native方法服务的。在虚拟机规范中对本地方法栈使用的语言、使用方式和数据结构没有强制规定,因此具体的虚拟机可以自由实现。

  在HotSpot虚拟机中把虚拟机栈和本地方法栈合二为一。

  是线程私有内存空间。

 

4、Java堆

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

  Java程序创建的对象实例几乎都在这里分配内存;在Java虚拟机规范中描述:所有的对象实例以及数据都要在堆上分配,但是随着JIT编译器的发展和逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有对象分配都在堆上也渐渐变得不是那么“绝对”了。

  Java堆是垃圾收集器管理的主要区域。

  Java堆空间还可以分为:新生代和老年代,新生代又可以细分为:Eden空间、From Survivor空间和To Survivor空间。

  如果在堆上没有内存空间可以完成对象实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryOut异常。

 

5、方法区

  方法区也是各个线程共享的内存区域。

  方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

  在HotSpot虚拟机上,GC分代收集扩展到了方法区,或者说使用永久代来实现方法区,这样可以像管理Java堆内存一样管理方法区内存,一般GC和老年代GC一起触发,所以在HotSpot虚拟机中,方法区也被称为“永久代”。

  方法区的内存回收主要是针对常量池的回收和对类型的卸载(不过条件相当苛刻)。

  方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

 

6、运行时常量池

  运行时常量池是方法区的一部分。

  Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息常量池,用于存放编译器生成的的各种字面常量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

  运行时常量池相对于Class文件常量池的另外一个重要特性是具备动态性,Java语言并不要求常量一定只有编译器才产生,运行期间也可能将新的常量放入到常量池中。

  当常量池无法申请到内存时将会抛出OutOfMemoryError异常。

 

7、直接内存

  直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。但是这部分内存也会被平凡的用到,也会出现OutOfMemoryError异常。

  JDK1.4引入了NIO类,一种基于通道(channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectButeBuffer对象作为这块内存的引用进行操作。这种方式避免了Java堆和Native堆中来回复制数据,在一些场景中可以显著提高性能。

 

转载于:https://www.cnblogs.com/super-jing/p/10786147.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高电压技术思维导图_钢铁技术:钢铁行业板坯连铸结晶器振动常见故障思维导图...

钢铁虾:(您距离钢铁虾只差关注)结晶器是连铸机的心脏,其振动偏差直接危及连铸过程的生产安全,其振动精度也往往与铸坯表面裂纹等缺陷息息相关。国内外常见板坯连铸结晶器振动形式有:①机械式振动;②双液压缸式振动&…

可以编辑vga格式文件的软件-PowerCreator Media Studio

vga格式的课件越来越多。不小心没有录制好的可见,想修改一下找了很久居然没有找到一个合适的软件。还有朋友给了一款:PowerCreator Media Studio用起来很方面,和premiere的操作很像。大赞。 安装后自带可以播放vga格式的播放器。 转载于:htt…

企业生产场景如何对CentOS进行分区

前言:我们买房子时,会考虑1室1厅,2室1厅,或3室2厅......!那么具体如何选,是要看手中的money和家庭的人口数量。同理,服务器操作系统在分区时也是如此,到底分3个区,4个区&…

获取当前文件所在路径

代码 1 unitUnit1;2 interface3 uses4 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,5 Dialogs, StdCtrls;6 type7 TForm1 class(TForm)8 Button1: TButton;9 Button2: TButton;10 procedureButton1Click(Sender: TObject);11 procedureButton2…

删除隐藏版本信息 版本回退_git之版本穿梭术

上一篇主要针对使用git add和git commit两个指令提交文件到本地版本库做了详细的介绍,其实提交文件到版本库无非就是两个步骤,先将文件添加到暂存区,所有要提交的文件全部添加完毕,统一提交到版本库。那我们每一次提交都会生成一个…

objective-c(初始化)

objective-c(初始化) 创建对象 (编程语言 Objective-C 2.0) 1.类对象与实例化 类的定义完成后,编译器在内存中自动生成唯一的类对象,实例对象都是通过调用类对象的类方法生成的。 类对象是工厂,同时也是蓝图,实例对象是…

使用sphinx快速为你python注释生成API文档

sphinx简介sphinx是一种基于Python的文档工具,它可以令人轻松的撰写出清晰且优美的文档,由Georg Brandl在BSD许可证下开发。新版的Python3文档就是由sphinx生成的,并且它已成为Python项目首选的文档工具,同时它对C/C项目也有很好的…

c#中使用ref和out传值

c#中使用ref和out传值 首先,如果不使用这两个关键字,那是什么样 呢?看下面的例子:使用ref:using System; class Test {     static void Swap(ref int x, ref int y)     {         int temp x;         x y;         y temp;     }  …

python临床数据_从临床试验中获取数据

我正在开发一个小Python函数来从clinicalTrials.gov中获取数据。从每个研究记录中,我想从中找出研究的目标条件。例如,对于this研究记录,我需要以下内容:conditions [Rhinoconjunctivitis, Rhinitis, Conjunctivitis. Allergy]然…

Jass 技能模型定义(转)

Jass是什么?先阐释一下什么是jass吧,百度:JASS(正确地说是JASS 2)是魔兽3的程序语言,用于控制游戏和地图的进行,也是魔兽游戏和地图的基础。 地图编辑器中摆放的单位(Unit),区域(Reg…

[原]第一次遭遇Oracle的Bug,纪念一下 |ORA-00600 kmgs_pre_process_request_6|

今天尝试调整一下Oracle的Large Pool Size,希望使rman的速度提升, alter system set large_pool_size80m ; 突然Oracle 实例挂掉了,查看alert file 发现如下 Wed Dec 16 11:14:49 2009 Errors in file /u01/app/admin/mydb/bdump/mydb_mman_…

表格过滤器_不用记账软件也可以记录支出明细,这个在线协同表格很方便

像我们这种中小团队,以前就用 Excel 来记录团队日常的一些支出情况,虽然有很多模板可以套用,但感觉还是有些不便之处,比如在表格里无法记录太多文字;添加发票凭证也不方便;对于不同数据的切换查看也缺乏灵活…

喜马拉雅第三方客户端开发(接口和接口数据解析)。

前言:最近闲来无事,看了网上豆瓣的第三方客户端,手有点痒,决定自己动手开发一个客户端,比较了荔枝和喜马拉雅,决定开发喜马拉雅的第三方客户端。 客户端使用了WPF开发。 1.抓取接口; 首先得解决…

life list 2010

1. water -1.no water-warm water.less 2. anything - very kindly 3. clean - any room. 4.money is working,no lazy. 转载于:https://www.cnblogs.com/byeday/archive/2009/12/16/1625902.html

聚合复合_聚合复合微生物菌剂的功能

不点蓝字关注我飞走啦!在经营肥料上来讲,大家都知道做复合微生物菌剂,不仅可以活化疏松土壤,而且在各种作物上抗逆、防病、增产的效果都非常的好。问为什么说大家都要重点使用聚合微生物菌剂呢?答因为聚合微生物菌剂和…

Linux命令 — 设置或查看网络配置命令ifconfig

1. 命令介绍命令格式:ifconfig 【interface】 【options】address主要参数:interface:网络接口名up:打开网络接口down:关闭网络接口broadcast:设置网络接口的广播地址netmask:设置网络接口的子网…

代理模式详解(静态代理和动态代理的区别以及联系)

原文链接:https://www.cnblogs.com/takumicx/p/9285230.html 1. 前言 代理模式可以说是生活中处处可见。比如说在携程上定火车票,携程在这里就起到了一个代理的作用,比起我们在官网上或者直接去柜台订票,携程可以为用户提供更多人性化的选择。再比如代购,我自己的mb…

unity自动生成敌人_unity 2d AI 敌人 自动追踪(1)

今天介绍第一种只靠 c# 代码的 简单 AI 敌人 追踪方法:简单粗暴 ,上代码1,新建对象2,代码如下:using System.Collections;using System.Collections.Generic;using UnityEngine;public class AI : MonoBehaviour{publi…

一个简单的HelloWorld程序

/* * 编译器:  VC6.0 * 类 型:  C语言 */ 1 #include <stdio.h>//#includes代表是C预处理指令,stdio.h代表是在此行位置键入了库文件stdio.h的完整内容,是标准输入输出头文件,< and >代表是直接从库文件加载stdio.h文件。2 3 intmain(void)//int代表此main…

sass 安装配置和使用

一、什么是SASSSASS在CSS的基础上做了一些扩展&#xff0c;使用SASS你可以使用一些简单的编程思想进来编写CSS。比如&#xff0c;SASS中可以定义变量、混合、嵌套以及 函数等功能。只不过SASS不像CSS&#xff0c;可以直接运用到项目中&#xff0c;如果你需要将样式运用到项目中…