文档章节

Java虚拟机各区域介绍

Joey_T
 Joey_T
发布于 2015/10/10 10:34
字数 1218
阅读 17
收藏 0

Java虚拟机在执行Java程序时会把它所管理的内存划分为若干个不同的数据区域。 Java虚拟机运行时区域图

程序计数器

程序计数器( Program Counter Register ) 是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java 虚拟机的多线程是通过线程轮流切换井分配处理器执行时间的方式来实现的,在任何一个确定的时刻,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器直不影响,独立存储,我们称这类内存区域为“线程私有”的内存。 如果线程正在执行的是一个 Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址:如果正在执行的是 Native方法,这个计数器值则为空(undefined)。

虚拟机栈

Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。每个方法被执行的时候都会同时创建一个栈帧(Stack Frame 用于存储局部变量表、操作栈、动态链接、方法出口等信息。

本地方法栈

本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码〉服务,而本地方法栈则是为虚拟机使用到的Native方法服务。

Java堆

Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。 Java堆是垃圾收集器管理的主要区域 因此很多时候也被称做“GC堆”(Garbage Collected Heap)。如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以 Java 堆中还可以细分为:新生代和老年代:再细致 点的有 Eden 空间、 From Survivor 空间、 To Survivor 空间等。Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。

方法区

方法区(Method Area)与Java堆一样,是各个钱程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap (非堆〉,目的应该是与 Java 堆区分开来。对于习惯在 HotSpot 虚拟机上开发和部署程序的开发者来说,很多人愿意把方法区称为“永久代”( Permanent Generation ),本质上两者并不等价,仅仅是因为 HotSpot虚拟机的设计团队选择把 GC 分代收集扩展至方能区,或者说使用永久代来实现方能区而已,其他虚拟机〈如 EA JRockit IBM J9 等〉来说是不存在永久代的概念的。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载。

运行时常量池

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

直接内存

直接内存( Direct Memory )井不是虚拟机运行时数据区的一部分,也不是 Java虚拟机规范中定义的内存区域。JDK 1.4中新加入NI(New Input/Output)类,引入了一种基于通道(Channe与缓冲区Buffer)的方式,它可以使用 Native 函数库直接分配堆外内存,后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。 显然,本机直接内存的分配不会受到Java堆大小的限制,但是,既然是内存,则肯定还是会受到本机总内存(包括RAM及SWAP区或者分页文件〉的大小及处理器寻址空间的限制。

© 著作权归作者所有

共有 人打赏支持
Joey_T
粉丝 1
博文 44
码字总数 22290
作品 0
徐汇
程序员
面试中关于Java虚拟机(jvm)的问题看这篇就够了

最近看书的过程中整理了一些面试题,面试题以及答案都在我的文章中有所提到,希望你能在以问题为导向的过程中掌握虚拟机的核心知识。面试毕竟是面试,核心知识我们还是要掌握的,加油~~~ 下面...

snailclimb
05/12
0
0
JVM内存结构 VS Java内存模型 VS Java对象模型

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模型和...

Java架构
07/11
0
0
Java虚拟机内存管理(一)—内存划分

Java 与 C++ 之间有一堵由内存动态分配和垃圾收集技术所围成的 “高墙”,墙外面的人想进去,墙里面的人却想出来。——《深入理解Java虚拟机:JVM高级特性与最佳时实践(第二版)》周志明 Ja...

Wizey
08/30
0
0
【JVM】 java内存区域与内存溢出异常

前言 此系列博客是读《深入理解java虚拟机》所做的笔记整理。 No1. JVM内存管理这堵墙? 对C和C++的开发人员来说,在内存管理领域,他们既拥有每一个对象的“所有权”,也担负着每一个对象生...

binggetong
05/07
0
0
《深入理解Java虚拟机》之Java虚拟机内存结构(1)

这个是很重要的一个基础认识。 java虚拟机规范规定的java虚拟机内存其实就是java虚拟机运行时数据区,其架构如下: 其中方法区和堆是由所有线程共享的数据区。 Java虚拟机栈,本地方法栈和程...

lixiyuan
2014/04/10
0
1

没有更多内容

加载失败,请刷新页面

加载更多

分布式缓存架构设计

零、 题记 在高并发场景下,需要通过缓存来减少数据库的压力,使得大量的访问进来能够命中缓存,只有少量的需要到数据库层。由于缓存基于内存,可支持的并发量远远大于基于硬盘的数据库。所以...

Ala6
23分钟前
2
0
简单工厂模式

public abstract class Operation { private double numberA = 0; private double numberB = 0; public double getNumberA() { return numberA; } ......

NinjaFrog
25分钟前
1
0
git(一) 基本操作(branch、tag、冲突)

layout: blog istop: true title: "git基本操作(branch、tag、冲突)" date: 2018-09-11 category: 版本控制 tags: - 版本控制 撤销操作 修改最后一次提交 解释:修改上次提交。可以修改内容...

开心的哈士奇
28分钟前
1
0
Vue中路由管理器Vue Router使用方式(二)-推荐

一、Vue中使用Vue Router简单方式使用 vue add xxx命令添加插件 使用步骤,本人假设已经安装好了Vue CLI工具,了解更多参考:VSCode 搭建Vue开发环境之Vue CLI 1.创建项目 vue create hello...

tianma3798
40分钟前
1
0
设计模式(十六)[结构模式] 装饰模式(Decorator)

1.什么是装饰模式? 装饰模式又名包装模式。装饰模式以对客户端透明的方式扩展对象功能,是继承关系的一个替代方案。 2.模式的类图 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收...

1527
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部