javaGC机制

了解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本身,也计划取消永久代。本文中,由于

U2FsdGVkX19qL/XxTm+z45Q+2k8EVrIHk0rAnoWD3BcVy7umGauZ42R1qonV5VNl
5ZKOVeIeqnQF7K9PJ+f5MdtVv+RvAnN22e/TbWPbhyAqyCs7ATlF/DvSB7UfnThhhDeZjMgW8PjSb1ifiErDy5OJIjN561s+vuFFTIctakDEb0bhwMfv5PC49lid+liUCInEaQ+rbepPkdHW9GPZz/kvNDmNZ0qBvJXAdhDh8PH9ryyKSq6annlek8Boe5Mb5kMisOsOtF/gtzdqauXkhOpdXHKznzTV6nhCCw9sePtJ+aXgHOcRqBGdi87KHveBJINXocHQjf1qZQy1aHvpQxQImdgUnzUCy2SVP39YJFp2T3EW1RvJPbnSGhN9i7VbDFJ/K8HdjtTW/SxOuFehLedfqj+3eWe7ouL0Qaw4WFFlDmcL+o54TVTru3+A2w0HvFK7KquGxN+pXphGA5SzxAKQHmnxSjs2Xnk+NLwTYT1KXq8or6Hr2cED59OipgQL3ltnPok5QXbKvuibrv7wJ1wd110PIRk437fe5SofD0FzX43B5lK/1VAnWN5Z7Y3WlzLNSx5tGoVr7iRIcctYn2b0b0oMVwhqYVuFrNVmOSJvVn0DOFWgI7+67k/LEqYWYQXGbCatcpmzCwapIByFSw==

笔者主要使用Oracle JDK6.0,因此仍将使用永久代一词。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值