【Java 之 JVM】Java内存结构小结

JVM体系主要包含以下部分:

类加载器、执行引擎,内存区,本地方法调用。

内存区一般即指运行时数据区,下面概括下各部分存储什么内容和作用:

程序计数器(PC寄存器)

线程私有。是一块较小的内存,可看作是线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。每个线程切换后能恢复到正确的执行位置,每条线程都有独立的程序计数器,各线程私有。入正在执行Java方法,记录正在执行的虚拟机字节码指令的地址;如果正执行Native方法,为空。没有规定任何OutOfMemoryError情况的区域。

Java虚拟机栈:

线程私有。描述Java方法执行的内存模型:每个方法在执行时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用直至执行完成的过程,就对应一个栈帧在虚拟机栈中入栈到出栈的过程。就是我们常分的“堆”和“栈”中的栈,或者说是局部变量表部分。

局部变量表存放编译器可知的基本数据类型和引用类型。局部变量表所需内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈中分配多大的局部变量空间是完全确定的。

本地方法栈:

与虚拟机栈作用相似,不同的是虚拟机栈为执行Java方法(字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。有的虚拟机入Sun Spot已将此部分与虚拟机栈合并。

Java堆:

线程共享。是Java虚拟机所管理的内存中最大的一块。在虚拟机启动时创建。唯一目的就是存放对象实例,几乎所有对象实例都在分配内存。是垃圾收集器管理的主要区域,亦成为“GC堆”。垃圾收集器基本都采用分代收集算法,所以,java堆还可以细分为:新生代和老年代;再细一点可分为Eden空间、From Survivor空间、To Survivor空间等。物理不连续,逻辑连续。可固定大小也可扩展。

方法区:

线程共享。存储一杯虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。JVM规范将其描述为堆的一个逻辑部分,但却有个别名——非堆,就是为与Java堆区分开来。

运行时常量池:

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

直接内存:

不属于是形式数据区一部分,也不是JVM规范中定义的区域。因为这部分内存被频繁使用,所以也要关注。在JDK1.4引入NIO类,引入了基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因此避免了在Java堆和Native堆中来回复制数据。

时间: 2024-10-23 10:17:13

【Java 之 JVM】Java内存结构小结的相关文章

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

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

java学习-----jvm的内存分配及运行机制

VM运行时数据区域: 根据<Java虚拟机规范(第二版)>的规定,JVM包括下列几个运行时区域: 我们思考几个问题: 1.jVM是怎么运行的? 2.JVM运行时内存是怎么分配的? 3.我们写的java代码(类,对象,方法,常量,变量等等)最终存放在哪个区? VM运行时数据区域: 1.程序计数器(program Counter Register):   是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的

JVM的内存结构,JVM的回收机制

内存作为系统中重要的资源,对于系统稳定运行和高效运行起到了关键的作用,Java和C之类的语言不同,不需要开发人员来分配内存和回收内存,而是由JVM来管理对象内存的分配以及对象内存的回收(又称为垃圾回收.GC),这对于开发人员来说确实大大降低了编写程序的难度,但带来的一个副作用就是,当系统运行过程中出现JVM抛出的内存异常(例如OutOfMemoryError)的时候,很难知道原因是什么,另外一方面,要编写高性能的程序,通常需要借助内存来提升性能,因此如 何才能合理的使用内存以及让JVM合理的进行

JVM内存结构小结

JVM按照运行时数据的存储结构来划分内存结构,JVM在运行Java程序时,将它们划分为几种不同格式的数据,分别存储在不同的区域,这些数据统一称为运行时数据(Runtime Data). 1.PC寄存器 PC寄存器严格来说是一个数据结构,它用于保存当前正常执行的程序的内部地址. 同时Java程序是多线程执行的,所以不可能一直按照线性执行下去,当有多个线程交叉执行时,被中断线程的程序当前执行到哪条语句对应的内存地址必然要保存下来,以便于它被恢复执行时再按照被中断时的指令地址继续执行下去. 2.Jav

了解java虚拟机---JVM的基本结构(1)

1. JVM的基本结构 1.1. 类加载子系统 类加载子系统负责从文件或者网络中加载Class信息,加载的类信息存放于方法区的内存空间.方法区中可能还会存放运行时常量信息,包括字符串与数字常量.(这部分常量信息是Class文件中常量池部分的内存映射). 1.2. JAVA堆 JAVA的堆在JVM启动的时候建立,几乎所有的Java对象实例都存放于Java堆中.堆空间是所有线程共享的.根据垃圾回收机制的不同,JAVA堆有可能拥有不同的结构.最为常见的一种结构是将整个堆分为新生代和老年代以及持久代.

【java】JVM的内存区域划分

学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的呢? 由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分.在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: 如上图所示,首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加

JVM的内存结构

Java是按照运行时数据的存储结构来划分内存结构的,java虚拟机规范将java运行时的诗句划分为6种: 1.PC寄存器 用于保存当前执行程序的内存地址,同时java程序是多线程的,不可能一直都按照线性执行下去,当有多个线程交叉执行时,被中断的线程程序当前执行到哪条的内存地址需要记录下来. 2.java栈 java栈是与线程相关到一起的,每当创建一个线程时,JVM就会为这个线程创建一个java栈,这个hava栈中含有很多的栈帧,栈帧是与每个方法关联起来的,每运行一个方法就会创建一个栈帧.每个栈帧

java虚拟机 jvm java堆 方法区 java栈

java堆是java应用程序最密切的内存空间. 差点儿全部的对象都存在堆中.java堆全然自己主动化管理,通过垃圾回收机制,垃圾对象会自己主动清理.不须要显式释放. 依据java垃圾回收机制的不同.java堆可能有不同的结构. 最常见的是将整个java堆分为新生代和老年代.跟人类几乎相同了.老龄化就有可能找上帝去了,新生代存放新对象或者年龄不大的对象,老年代存放老年对象.新生代有可能分为eden区.s0区和s1区,s0区和s1区也被称之为 from 到to区域.他们是两块大小相等能够互换的内存空

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

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