`
- 浏览:
216638 次
- 性别:
- 来自:
深圳
-
JVM的一个关键特征是它的GC Heap。Heap保存了Java运行期的所有对象,数组。GC可以动态释放Heap中不再使用的空间。在Java程序里,一个对象可以通过关键字new来创建,“创建”对于JVM来说就是在Heap里分配一块空间保存新对象。GC,也就是Garbage collection,既清除Heap里不再使用的对象。为了清除这些对象,GC必须调用这些对象的Finalizer。另为GC还可以合并Heap中的空间碎片。Heap空间碎片是由于不断分配和释放造成的。如果不合并这些碎片,即使有足够的空间,由于没有足够大的连续空间而不得不扩大Heap空间,扩大空间会降低运行性能。
GC算法
目前已经实现了很多GC算法,处理Sun之外,IBM,Symantec,Microsoft,HP,以及各种开源组织都投入到这项研究。那他们竞争的关键就在于GC的Heap。任何一个GC算法都必须做两件事,一,它必须能找到所有的垃圾对象,也就是不再使用的对象,二,它必须可以回收垃圾对象空间。
通常,搜索垃圾的工作,首先建立一组类似于树的结构,树根为root,节点则叫做对象引用。任何一个对象如果在各种结构里能找到它的引用,则成为该对象可使用(reachable)或称对象状态是活动的(live),而任何没有在结构里找到引用的对象则称为垃圾。在JVM里,所有的对象都保存在Heap里,本地变量则保存在Java Stack里,每个线程都有自己的Stack。每个本地变量或是对象引用,或是基本数据类型,例如int, char或float。因此,线程里保存的只是对象的引用,而对象的实例都保存在Heap中。当一个线程结束,线程里对象引用将被删除,那么这些对象就有可能成为Heap中的垃圾。(“有可能”是因为对象有可能在其他线程中被引用。)
区别可使用对象和垃圾对象有两种方法,他们是引用计数和遍历搜索。引用计数就是在Heap中记录各个对象的引用数。遍历搜索是在树结构里搜索对象引用,并在Heap里标记被引用的对象,遍历后,那些没有标记的对象则是垃圾。
引用计数器
引用计数器保存在对象里,当一个对象被创建时,计数器为1。当其他对象引用这个对象时,该对象的引用计数器加1。当对这个对象的引用结束时,计数器减1。引用计数器为0时,则被看作是垃圾。该算法的缺点是没有遍历功能。该算法已经过时,现在的JVM都采用第二种方法遍历搜索法。
遍历搜索器
搜索器从树结构的根节点开始遍历,寻找对象引用,并把被引用的对象做标记(Mark)。遍历之后,未作标记的对象被视为垃圾,可被GC回收(Sweep)。
碎片整理器
Heap碎片整理(Compacting collector)有两个步骤,整理和拷贝。这两步用来移动Heap中的对象从而减少碎片。既然好移动对象的位置,当要也要更新对象的引用,但是更新对象引用是会降低VM的性能,因此建立一个对象句柄表,对象引用指向对象句柄,当对象移动时,更新对象的句柄,而不用改变对象引用的值。拷贝步骤就是将Heap的对象移动到新的位置。为了提高拷贝的性能,VM被分为两个区,VM在内只能使用两个中的一个。当使用中的区没有空间后,将所有的对象从该空间拷贝到另一个空间,并继续在另一个空间工作,直到另一个空间满了为止,再把所有对象拷贝回原来的空间。该方法的代价就是需要花费2倍的空间。
source:
http://developer.51cto.com/art/200607/29155.htm
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
详细介绍JVM gc原理, heapsize调优方法。 本文虽以IBM jdk为例讲解,但实际不仅限于于IBM jdk,其原理和方法同样适用于oracle jdk
JVM、GC详解及调优,JVM、GC详解及调优,JVM、GC详解及调优
讲解java GC回收机制 讲解 JVM PrintGCDetails 信息各行各列的解释
1.jvm内存结构及功能概述 2.Jvm Heap 内存结构 3.Jvm 的内存分配
JVM内存的调优 1. Heap设定与垃圾回收Java Heap分为3个区,Young,Old和Permanent。Young保存刚实例化的对象。...JVM的Heap分配可以使用-X参数设定, -Xms 初始Heap大小 -Xmx java heap最大值 …… ……
后来我们就用CMS gc(-XX:+UseConcMarkSweepGC),当时的总heap还是3g,新生代1.5g后,观察不是很理想,改为jvm heap为2g新生代设置-Xmn1g,在这样的情况下young gc发生的频率变成7、8秒一次,平均每次时间40-50毫秒...
很多人上手ES的时候,对GC一点概念都没有就去网上抄各种JVM“优化”参数,却仍然被heap不够用,内存溢出这样的问题搞得焦头烂额。即使对于JVM GC机制不够熟悉,头脑里还是需要有这么一个基本概念: 应用层面生成大量...
很多人上手ES的时候,对GC一点概念都没有就去网上抄各种JVM“优化”参数,却仍然被heap不够用,内存溢出这样的问题搞得焦头烂额。即使对于JVM GC机制不够熟悉,头脑里还是需要有这么一个基本概念: 应用层面生成大量...
绍深入Java虚拟机:JVM中的Stack和Heap
记录java.lang.OutOfMemoryError:Java heap space的情况 文章内容: 一.问题描述+原因分析+解决方案 二.JVM调优说明 三.Tomcat添加到jvisualvm监控
1.JVM的gc概述 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有规定gc如何工作。不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作。 ...
JVM JVM运行时内存分区 程序计数器 程序计数器的特点 Java虚拟机栈 栈帧 局部变量表 操作数栈 ...(永久代和元空间都是方法区的实现),字符串常量池也移动到了heap空间 jdk8之后的jvm内存分区 程
JVM垃圾回收机制(GC) 引入:我们都知道,栈内存中方法运行完毕后会有弹栈的操作,不会产生垃圾,而堆内存中却没有这种操作,当堆内存中很多无用的成员变量、对象等等积压到一定程度时,就会发生堆内存溢出的一个错误...
应用出现OutOfMemory等内存异常,应用中有使用本地缓存且占用大量内存空间,系统吞吐量与响应性能不高或不降,Heap内存(老年代)持续上涨达到设置的最大内存值,Full GC 次数频繁。等有解决方法 JVM调优主要是针对...
funll GC频繁非常影响性能,我们把jvm的heapdump( Java 堆栈的快照)文件导出来,采用IBM HeapAnalyzer 的分析工具进行分析。经过分析发现堆中存在很多session对象。这些session对象占用空间比较大大,而且占堆内存...
3、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法 4、Perm Space中保存什么数据?会引起OutOfMemory吗? 5、什么是类的加载 6、如何⾃定义⼀个类加载器?你使⽤过哪些或者你在什么场景下需要⼀个⾃...
heap space: 堆内存溢出 (-Xms30m -Xmx30m -XX:+PrintGCDetails) GC overhead limit exceeded: gc占用98%的资源回收效率不足2%的(-Xms30m -Xmx30m) Metaspace:方法区异常----(XX:MetaspaceSize=10M -XX:...
垃圾收集(GC)是指JVM释放Java堆中不再使用的对象所占用的内存的过程,而Java堆(Heap)是指Java应用程序对象生存的空间。堆大小决定了GC的频度和时间。堆越大,GC频度低,速度慢。堆越小,GC频度高,速度快。所以GC和堆大小...
java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环; 如果是java堆内存不够的话,可以通过调整JVM下面的配置来解决: <jvm>-Xms3062m</...
JVM运行时数据区1 JVM运行时数据区2 解析JVM运行时数据区2.1 方法区(Method Area)2.2 Java堆(Java Heap)2.3 程序计数器(Program Counter Register)2.4 Java虚拟机栈(Java Virtual Machine Stacks)2.5 本地...