JVM内存区域划分与管理

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

Class loader子系统的作用:根据给定的全限定名类名(如 java.lang.Object)来装载class文件的内容到 Runtime data area中的method area(方法区域)。Java程序员可以extends java.lang.ClassLoader类来写自己的Class loader。

Execution engine子系统的作用:执行classes中的指令。任何JVM specification实现(JDK)的核心都是Execution engine,不同的JDK例如Sun 的JDK 和IBM的JDK好坏主要就取决于他们各自实现的Execution engine的好坏。

Native interface组件:与native libraries交互,是其它编程语言交互的接口。当调用native方法的时候,就进入了一个全新的并且不再受虚拟机限制的世界,所以也很容易出现 JVM无法控制的native heap OutOfMemory。

1、PROGRAM COUNTER REGISTER

程序计数器可以当前字节码执行的行号指示器,它跟字节码解释器一起工作。程序计数器可以得到字节码的位置,然后可以得到字节码。通过解释器又可以改变程序计数器的值。去得到下一个字节码。所以分支、循环、转跳、异常处理、线程恢复等基础功能都需要依赖这个程序计数器来完成。

2、JAVA STACK

用于存储局部变量表(局部变量表存放了编译器可知的各种基本数据类型)、操作数栈、动态链接、方法出口等信息。

3、NATIVE MOTHED STACK

它跟JAVA STACK差不多,不过NATIVE MOTHED STACK只是为本地虚拟机使用到的Native方法服务的。

4、HEAP

Java堆是被所有线程共享的一块区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实际都在这里分配内存。Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”。如果从内存回收的角度来看,由于收集器基本都采用分代收集算法,所以Java堆中还可以细分为:新生代和老年代。由于这个过分复杂,这里就不讨论了。

5、METHOD AREA

方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量表。

参考书籍:深入理解Java虚拟机

时间: 2024-10-11 01:31:00

JVM内存区域划分与管理的相关文章

JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释

http://blog.csdn.net/zhushuai1221/article/details/51027024 JVM内存区域划分Eden Space.Survivor Space.Tenured Gen,Perm Gen解释 以下内容转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29632145&id=4616836 jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园)

JVM内存区域划分及垃圾回收

第一部分.闲扯+概述 近来在研读<深入理解java虚拟机>一书,读完之后做个小结,算是记录一下自己的学习所得,在成长的路上,只能死磕. 要理解JVM,就要先从其内存区域划分开始,知道其由几部分构成,再了解各部分的功能,这样就能对其整体有一个了解. 话不多说,总体图先呈上: 可以看到,线程私有的内存区域有虚拟机栈.本地方法栈.程序计数器,这些区域都不会出现线程安全问题:而线程共享的区域有堆.方法区. 下面对其各个分区域进行介绍. 第二部分:JVM内存区域划分 1.首先是最简单的程序计数器,每个线

JVM内存区域划分及GC简述

通常情况下,JVM(Java Virtual Machine,Java虚拟机)将内存区域划分为以下5个部分: 1.Method Area(Non-Heap)(方法区) --线程共享 2.Heap(堆) --线程共享 3.Program Counter Register(程序计数器) --非线程共享 4.VM Stack(虚拟机栈)--非线程共享 5.Native Method Stack ( 本地方法栈 )--非线程共享 JVM运行的时候会分配好Method Area(方法区)和Heap(堆):

[转]JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释

jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分:Code Cache(代码缓存区).Perm Gen(永久代).Jvm Stack(Java虚拟机栈).Local Method Statck(本地方法栈). HotSpot虚拟机GC算法采用分代收集算法: 1.一个人(对象)出来(new 出来)后会在Eden Space(伊甸园)无忧无虑的生活,直

JVM内存区域划分Eden Space,Survivor Space,Tenured Gen,Perm Gen

jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分:Code Cache(代码缓存区).Perm Gen(永久代).Jvm Stack(java虚拟机栈).Local Method Statck(本地方法栈). HotSpot虚拟机GC算法采用分代收集算法: 1.一个人(对象)出来(new 出来)后会在Eden Space(伊甸园)无忧无虑的生活,直

JVM内存区域划分总结

发现网上有两个版本的JVM内存划分,一个是按照<深入理解JVM虚拟机>上的版本,包含程序计数器等,按照是否线程共享划分. 另一个我觉得更好记一些,也更适合我自己,在这里记录一下. 首先上思维导图: 一个个来说道吧. 堆内存 heap 堆内存主要被划分为新生代和老年代(差不多的意思) 基本上所有对象实例都在堆中创建,因此堆内存经常发生GC回收操作.新的对象首先分配在Eden区,两个Surviior区仅作为Eden区的缓冲使用.每次GC回收一次,对象的age值就+1,当Survivor区对象age

JVM内存区域划分

这几天从图书馆借了<深入理解Java虚拟机>,看到内存区域这一章,总结了一下. Java虚拟机所管理的内存区域如下图所示: 其中各区域具体的作用如下 1.程序计数器 字节码解释器通过改变程序计数器的值来选取下一条要执行的字节码指令(分支.循环线程恢复等基础功能都需要依赖这个计数器):每个线程都有一个独立的程序计数器(各线程的计数器间互不影响,独立储存):此内存区域不会发生OutOfMemoryError. 2.Java虚拟机栈 虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都

图解JVM内存区域划分

图解JVM类加载机制和双亲委派模型一文中讲述了 Java 类加载的过程,它包含加载.验证.准备.解析.初始化.使用.卸载这 7 个步骤.在准备阶段,JVM会将类加载到内存中,为类变量分配内存并赋予初值:在初始化阶段则会正式执行初始化代码. 那么在准备阶段和初始化阶段,JVM 具体是怎么为类分配内存的呢? JVM 把字节码文件加载进来之后放在哪里?代码运行的时候,方法和局部变量放在哪里?创建的对象又该放在哪里? 方法区/Metaspace:JVM加载进来的字节码文件会保存在方法区,Java8之后被

JVM的内存区域划分,对象实例化分析

一.JVM程序具体执行过程 由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分.在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程:                                     如上图所示,Java源代码文件(.java后缀)经过Java编译器编译成为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行.在整个程序执行过程中,JVM会用一