`
lhg4study
  • 浏览: 10979 次
文章分类
社区版块
存档分类
最新评论

【JVM学习笔记】JAVA内存区域介绍

阅读更多
第一章:JAVA内存区域介绍
对于JVM内存的分类,我们常常会划分两种:栈内存(Stack)和堆内存(Heap),栈中保存的是各种基本的数据类型(boolean、bytes、char、short、int、flioat、long、double等),而new出来的对象实例都会保存在heap堆内存中,之所以会这么划分是由于在编码过程中往往只会涉及到这两部分。根据JVM规范里虚拟机结构的描述,jvm运行时数据区划分为以下几部分:程序计数器(PC register)、虚拟机栈(JVM statck)、本地方法栈(Native method Stack)、堆(Heap)、方法区(Method Area)
(图1)
程序计数器(Program Counter Register)
此区域是很小的一块内存空间,记录下一条需要执行的字节码指令。JVM多线程的通过线程轮流切换来分配处理器的执行时间,所以在任何时刻,单个处理器只会执行一个指令,所以每个线程都会有自己独立的程序计数器,各个线程之间的计数互不影响,独立存储。所以此类区域是线程私有的内存,此区域不会出现任何的OutOfMemory异常。
栈(Stack)
每个方法被执行的时候会创建一个栈帧(Stack  Frame),每个栈帧包括局部变量表、操作数栈,存储的是此次调用过程中的参数、临时变量以及中间结果;一个方法调用至完成的过程,对应着一个栈帧从入栈到出栈的过程,此区域也是线程私有的内存。局部变量表中存放的是8种基本数据类型以及对象引用reference类型。
本地方法栈(Native Method Stack)
作用于栈基本类似,只是是为jvm调用的native方法服务,存储每个native
方法调用的状态。
堆(Heap)
Java堆是存放对象实例的区域,被所有的线程共享,也是内存最大的一块。几乎所有的对象实例都会在堆上分配内存,所以此处也是垃圾回收(GC)的主要区域。现在的垃圾收集器大都采用的是分代收集算法,所以堆还可以细分为:年轻代(Young Generation)和年老代(Old  Generration),年轻代又可细分为三个区域
:一个Eden区,两个Suivivor区(From Survivor 、To Suivivor)。
(图2)
方法区(Method Area)
方法区也是所有线程共享的一块内存区域,存储加载的类信息、静态变量、常量等信息,JVM中一般用持久代来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。
  • 大小: 63.2 KB
  • 大小: 23.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics