文档章节

Java虚拟机各区域介绍

Joey_T
 Joey_T
发布于 2015/10/10 10:34
字数 1218
阅读 18
收藏 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
徐汇
程序员
私信 提问
JVM内存结构 VS Java内存模型 VS Java对象模型

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

Java架构
2018/07/11
0
0
面试中关于Java虚拟机(jvm)的问题看这篇就够了

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

snailclimb
2018/05/12
0
0
【JVM】 java内存区域与内存溢出异常

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

binggetong
2018/05/07
0
0
JVM(二)Java虚拟机组成详解

导读:详细而深入的总结,是对知识“豁然开朗”之后的“刻骨铭心”,想忘记都难。 Java虚拟机(Java Virtual Machine)下文简称jvm,上一篇我们对jvm有了大体的认识,进入本文之后我们将具体...

王磊的博客
01/14
133
0
JVM系列(二)—JVM内存结构

所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些...

haoyuehong
2018/12/29
52
0

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
今天
9
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
17
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
9
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部