jvm

在这里插入图片描述

 了解Java GC机制,必须先清楚在JVM中内存区域的划分。在Java运行时的数据区里,由JVM管理的内存区域分为下图几个模块:

1,程序计数器(Program Counter Register):程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是当前线程的行号指示器。字节码解释器在工作时,会通过改变这个计数器的值来取下一条语句指令。

每个程序计数器只用来记录一个线程的行号,所以它是线程私有(一个线程就有一个程序计数器)的。

如果程序执行的是一个Java方法,则计数器记录的是正在执行的虚拟机字节码指令地址;如果正在执行的是一个本地(native,由C语言编写 完成)方法,则计数器的值为Undefined,由于程序计数器只是记录当前指令地址,所以不存在内存溢出的情况,因此,程序计数器也是所有JVM内存区 域中唯一一个没有定义OutOfMemoryError的区域。

2,虚拟机栈(JVM Stack):一个线程的每个方法在执行的同时,都会创建一个栈帧(Statck Frame),栈帧中存储的有局部变量表、操作站、动态链接、方法出口等,当方法被调用时,栈帧在JVM栈中入栈,当方法执行完成时,栈帧出栈。

局部变量表中存储着方法的相关局部变量,包括各种基本数据类型,对象的引用,返回地址等。在局部变量表中,只有long和double类型会占 用2个局部变量空间(Slot,对于32位机器,一个Slot就是32个bit),其它都是1个Slot。需要注意的是,局部变量表是在编译时就已经确定 好的,方法运行所需要分配的空间在栈帧中是完全确定的,在方法的生命周期内都不会改变。

虚拟机栈中定义了两种异常,如果线程调用的栈深度大于虚拟机允许的最大深度,则抛出StatckOverFlowError(栈溢出);不过多 数Java虚拟机都允许动态扩展虚拟机栈的大小(有少部分是固定长度的),所以线程可以一直申请栈,知道内存不足,此时,会抛出 OutOfMemoryError(内存溢出)。

每个线程对应着一个虚拟机栈,因此虚拟机栈也是线程私有的。

3,本地方法栈(Native Method Statck):本地方法栈在作用,运行机制,异常类型等方面都与虚拟机栈相同,唯一的区别是:虚拟机栈是执行Java方法的,而本地方法栈是用来执行native方法的,在很多虚拟机中(如Sun的JDK默认的HotSpot虚拟机),会将本地方法栈与虚拟机栈放在一起使用。

本地方法栈也是线程私有的。

4,堆区(Heap):堆区是理解Java GC机制最重要的区域,没有之一。在JVM所管理的内存中,堆区是最大的一块,堆区也是Java GC机制所管理的主要内存区域,堆区由所有线程共享,在虚拟机启动时创建。堆区的存在是为了存储对象实例,原则上讲,所有的对象都在堆区上分配内存(不过现代技术里,也不是这么绝对的,也有栈上直接分配的)。

一般的,根据Java虚拟机规范规定,堆内存需要在逻辑上是连续的(在物理上不需要),在实现时,可以是固定大小的,也可以是可扩展的,目前主 流的虚拟机都是可扩展的。如果在执行垃圾回收之后,仍没有足够的内存分配,也不能再扩展,将会抛出OutOfMemoryError:Java heap space异常。

关于堆区的内容还有很多,将在下节“Java内存分配机制”中详细介绍。

5,方法区(Method Area):在Java虚拟机规范中,将方法区作为堆的一个逻辑部分来对待,但事实 上,方法区并不是堆(Non-Heap);另外,不少人的博客中,将Java GC的分代收集机制分为3个代:青年代,老年代,永久代,这些作者将方法区定义为“永久代”,这是因为,对于之前的HotSpot Java虚拟机的实现方式中,将分代收集的思想扩展到了方法区,并将方法区设计成了永久代。不过,除HotSpot之外的多数虚拟机,并不将方法区当做永 久代,HotSpot本身,也计划取消永久代。本文中,由于笔者主要使用Oracle JDK6.0,因此仍将使用永久代一词。

方法区是各个线程共享的区域,用于存储已经被虚拟机加载的类信息(即加载类时需要加载的信息,包括版本、field、方法、接口等信息)、final常量、静态变量、编译器即时编译的代码等。

方法区在物理上也不需要是连续的,可以选择固定大小或可扩展大小,并且方法区比堆还多了一个限制:可以选择是否执行垃圾收集。一般的,方法区上 执行的垃圾收集是很少的,这也是方法区被称为永久代的原因之一(HotSpot),但这也不代表着在方法区上完全没有垃圾收集,其上的垃圾收集主要是针对 常量池的内存回收和对已加载类的卸载。

在方法区上进行垃圾收集,条件苛刻而且相当困难,效果也不令人满意,所以一般不做太多考虑,可以留作以后进一步深入研究时使用。

在方法区上定义了OutOfMemoryError:PermGen space异常,在内存不足时抛出。

运行时常量池(Runtime Constant Pool)是方法区的一部分,用于存储编译期就生成的字面常量、符号引用、翻译出来的直接引用(符号引用就是编码是用字符串表示某个变量、接口的位置,直接引用就是根据符号引用翻译出来的地址,将在类链接阶段完成翻译);运行时常量池除了存储编译期常量外,也可以存储在运行时间产生的常量(比如String类的intern()方法,作用是String维护了一个常量池,如果调用的字符“abc”已经在常量池中,则返回池中的字符串地址,否则,新建一个常量加入池中,并返回地址)。

6,直接内存(Direct Memory):直接内存并不是JVM管理的内存,可以这样理解,直接内存,就是 JVM以外的机器内存,比如,你有4G的内存,JVM占用了1G,则其余的3G就是直接内存,JDK中有一种基于通道(Channel)和缓冲区 (Buffer)的内存分配方式,将由C语言实现的native函数库分配在直接内存中,用存储在JVM堆中的DirectByteBuffer来引用。 由于直接内存收到本机器内存的限制,所以也可能出现OutOfMemoryError的异常。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值