JVM的内存模型

JVM的内存模型

概述

Java虚拟机在执行java程序的过程中,会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。

java虚拟机所管理的内存包括以下几个运行时数据区域:

  • 方法区(包括运行时常量池):存储类信息、常量、静态变量、即时编译器编译后的代码等;各种字面量和符号引用。
  • Java堆:存储java对象。
  • 虚拟机栈:存储方法以及方法中的存储局部变量表(存放基本数据类型和引用类型)、操作数栈、动态链接、方法出口等信息。
  • 本地方法栈:和虚拟机栈类似,只不过存储的是native方法。
  • 程序计数器:存储当前线程执行的字节码的行号。

其中属于所有线程共享的数据区是:方法区、堆;

属于线程隔离(线程安全)的数据区是:虚拟机栈、本地方法区、程序计数器。

Java堆

对大多数应用来说,Java堆是JVM管理的内存中最大的一块。在虚拟机启动时创建,唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

Java堆是垃圾收集器管理的主要区域,因此很多时候也叫GC堆。从内存回收的角度看,由于现在收集器基本都是采用分代收集算法,所以Java堆还可以细分为:新生代和老年代。

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

  1. Java进程启动时,虚拟机就会分配一块初始堆空间,可以使用参数-Xms指定这块空间的大小;
  2. 如果初始堆空间耗尽,虚拟机会对堆空间继续扩展,其扩展上限为最大堆空间,最大堆空间可以使用参数-Xmx指定;

方法区

方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然java虚拟机规范将方法去描述为一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的是与java堆区分开来。

当该方法区无法满足内存分配需求时,将抛出OutOfMemoryError错误。

运行时常量池

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

虚拟机栈

它的生命周期与线程相同,虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时会创建一个栈帧,用于存储局部变量表(存放基本数据类型和引用类型)、操作数栈、动态链接、方法出口等信息。每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。平时所说的堆内存、栈内存中的栈内存就是虚拟机栈。

当线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverFlowError异常;如果虚拟机栈可以动态扩展(大部分虚拟机都支持动态扩展,只不过虚拟机规范也允许固定长度的虚拟机栈),如果拓展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

本地方法栈

和虚拟机栈类似,区别就是本地方法栈为虚拟机使用的Native方法服务,与虚拟机栈一样,也会抛出OutOfMemoryError和StackOverFlowError异常。

程序计数器

这是一块较小的内存,它可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器完成。

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

此内存区域是唯一一个java虚拟机规范里面没有规定任何OutOfMemoryError情况的区域。

参考:《深入理解Java虚拟机》— 周志明

原文地址:https://www.cnblogs.com/scuwangjun/p/8886526.html

时间: 2024-10-29 22:32:09

JVM的内存模型的相关文章

java中JVM虚拟机内存模型详细说明

java中JVM虚拟机内存模型详细说明 2012-12-12 18:36:03|  分类: JAVA |  标签:java  jvm  堆内存  虚拟机  |举报|字号 订阅 JVM的内部结构如下图: 一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能. 本文将从JVM内存模型.GC工作原理,以及GC的几个关键问题进行探讨,从

JVM运行时数据区与JVM堆内存模型小结

前提 JVM运行时数据区和JVM内存模型是两回事,JVM内存模型指的是JVM堆内存模型. 那JVM运行时数据区又是什么? 它包括:程序计数器.虚拟机栈.本地方法栈.方法区.堆. 来看看它们都是干嘛的 程序计数器:保存当前线程执行的指令的地址(大意如此). 虚拟机栈:由栈帧组成,而每个栈帧又包括局部变量表.操作数栈.动态连接(调用其他方法).出口(被调用时返回值) -- 每个栈帧就代表了一个方法的执行. 本地方法栈:类似虚拟机栈,只不过方法改成了native方法. 方法区:保存了类的各种信息.类的

jvm Java内存模型

硬件的效率与一致性 在计算机中,内存的读写与处理器的计算速度有几个级的差距.这样会严重影响到TPS(Transations Per Second). 所以会为每个处理器配一个高速缓存以缓和处理器的速度.而在计算机中,多个处理器共享一个内存,这个时候数据的读写操作将不会安全 什么是内存模型                                                                        名词解释:JMM(Java Memory Model),即Java内

JVM虚拟机内存模型以及GC机制

JAVA堆的描述如下: 内存由 Perm 和 Heap 组成. 其中 Heap = {Old + NEW = { Eden , from, to } } JVM内存模型中分两大块,一块是 NEW Generation, 另一块是Old Generation. 在New Generation中,有一个叫Eden的空间,主要是用来存放新生的对象,还有两个Survivor Spaces(from,to), 它们用来存放每次垃圾回收后存活下来的对象.在Old Generation中,主要存放应用程序中生

【转】JVM虚拟机内存模型

转发声明: 本文原创作者:书呆子Rico 作者博客地址:http://blog.csdn.net/justloveyou_/ 摘要: 我们都知道,Java程序在执行前首先会被编译成字节码文件,然后再由Java虚拟机执行这些字节码文件从而使得Java程序得以执行.事实上,在程序执行过程中,内存的使用和管理一直是值得关注的问题.Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些数据区域都有各自的用途,以及创建和销毁的时间,并且它们可以分为两种类型:线程共享的方

JVM——java内存模型和线程

概述 计算机的运算速度与它的存储和通信子系统速度的差距太大,大量的时间都花费在磁盘I/O.网络通信或者数据库访问上.我们当然不希望处理器大部分时间都处于等待其他资源的状态,要通过一些“手段”去把处理器的运算能力“压榨”出来,不然太浪费了. 衡量一个服务性能的高低好坏,每秒事务处理数(Transactions Per Second,TPS)是最重要的指标之一.代表一秒服务端平均能响应的请求总数,而TPS值与程序的并发能力又有密切的相关. 硬件的效率与一致性 处理器要和内存交互(取运算数据.存储运算

jvm的stack和heap,JVM内存模型,垃圾回收策略,分代收集,增量收集(转)

深入Java虚拟机:JVM中的Stack和Heap(转自:http://www.cnblogs.com/laoyangHJ/archive/2011/08/17/gc-Stack.html) 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题. 一般,JVM的内存分为两部分:Stack和Heap. Stack(栈)是JVM的内存指令区.Stack管理很简单,push

JVM内存模型以及HotSpot的GC策略

概述 想要进一步掌握Java语言,必须要深入了解一下Java程序的运行环境.本文会对JVM的内存模型.Java内存自动管理机制.以及Oracle官方虚拟机HotSpot在GC方面的实现策略进行大概的梳理. 什么是Java的内存模型? 众所周知,Java程序是运行在JVM上面的,但是不具体指定是哪一款JVM,只要是符合一定的规范的JVM,都可以正确的运行Java字节码.该规范由Oracle官方提供,旨在描述一个抽象的JVM,它包含很多部分,包括class文件结构.运行时内存状态.指令集等. 而上述

JVM内存模型及垃圾收集策略解析

AD: JVM内存模型是Java的核心技术之一,之前51CTO曾为大家介绍过JVM分代垃圾回收策略的基础概念,现在很多编程语言都引入了类似Java JVM的内存模型和垃圾收集器的机制,下面我们将主要针对Java中的JVM内存模型及垃圾收集的具体策略进行综合的分析. 一 JVM内存模型 1.1 Java栈 Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程.它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文.栈空间随着线程的终止而释放.St