`
greenwen
  • 浏览: 216638 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JVM GC的Heap

    博客分类:
  • JVM
 
阅读更多
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
分享到:
评论

相关推荐

    JVM GC原理, heapsize调优

    详细介绍JVM gc原理, heapsize调优方法。 本文虽以IBM jdk为例讲解,但实际不仅限于于IBM jdk,其原理和方法同样适用于oracle jdk

    JVM、GC详解及调优

    JVM、GC详解及调优,JVM、GC详解及调优,JVM、GC详解及调优

    JVM PrintGCDetails 信息讲解

    讲解java GC回收机制 讲解 JVM PrintGCDetails 信息各行各列的解释

    jvm 内存分析文档

    1.jvm内存结构及功能概述 2.Jvm Heap 内存结构 3.Jvm 的内存分配

    weblogic内存调优

    JVM内存的调优 1. Heap设定与垃圾回收Java Heap分为3个区,Young,Old和Permanent。Young保存刚实例化的对象。...JVM的Heap分配可以使用-X参数设定, -Xms 初始Heap大小 -Xmx java heap最大值 …… ……

    JVM参数设置详细说明

    后来我们就用CMS gc(-XX:+UseConcMarkSweepGC),当时的总heap还是3g,新生代1.5g后,观察不是很理想,改为jvm heap为2g新生代设置-Xmn1g,在这样的情况下young gc发生的频率变成7、8秒一次,平均每次时间40-50毫秒...

    starcwang-canal_mysql_elasticsearch_sync-master.zip

    很多人上手ES的时候,对GC一点概念都没有就去网上抄各种JVM“优化”参数,却仍然被heap不够用,内存溢出这样的问题搞得焦头烂额。即使对于JVM GC机制不够熟悉,头脑里还是需要有这么一个基本概念: 应用层面生成大量...

    zxporz-ESClientRHL-es7.zip

    很多人上手ES的时候,对GC一点概念都没有就去网上抄各种JVM“优化”参数,却仍然被heap不够用,内存溢出这样的问题搞得焦头烂额。即使对于JVM GC机制不够熟悉,头脑里还是需要有这么一个基本概念: 应用层面生成大量...

    深入Java虚拟机:JVM中的Stack和Heap

    绍深入Java虚拟机:JVM中的Stack和Heap

    记录java.lang.OutOfMemoryErrorJava heap space的情况.docx

    记录java.lang.OutOfMemoryError:Java heap space的情况 文章内容: 一.问题描述+原因分析+解决方案 二.JVM调优说明 三.Tomcat添加到jvisualvm监控

    resin-jvm 调优

    1.JVM的gc概述 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有规定gc如何工作。不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作。 ...

    JVM教程吐血整理干货.md

    JVM JVM运行时内存分区 程序计数器 程序计数器的特点 Java虚拟机栈 栈帧 局部变量表 操作数栈 ...(永久代和元空间都是方法区的实现),字符串常量池也移动到了heap空间 jdk8之后的jvm内存分区 程

    JVM垃圾回收机制(GC)

    JVM垃圾回收机制(GC) 引入:我们都知道,栈内存中方法运行完毕后会有弹栈的操作,不会产生垃圾,而堆内存中却没有这种操作,当堆内存中很多无用的成员变量、对象等等积压到一定程度时,就会发生堆内存溢出的一个错误...

    jvm调优的一些相关参数

    应用出现OutOfMemory等内存异常,应用中有使用本地缓存且占用大量内存空间,系统吞吐量与响应性能不高或不降,Heap内存(老年代)持续上涨达到设置的最大内存值,Full GC 次数频繁。等有解决方法 JVM调优主要是针对...

    JSP session配置对web应用的影响

    funll GC频繁非常影响性能,我们把jvm的heapdump( Java 堆栈的快照)文件导出来,采用IBM HeapAnalyzer 的分析工具进行分析。经过分析发现堆中存在很多session对象。这些session对象占用空间比较大大,而且占堆内存...

    JVM面试专题

     3、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法 4、Perm Space中保存什么数据?会引起OutOfMemory吗? 5、什么是类的加载 6、如何⾃定义⼀个类加载器?你使⽤过哪些或者你在什么场景下需要⼀个⾃...

    java8源码-jvm-study:jvm-study

    heap space: 堆内存溢出 (-Xms30m -Xmx30m -XX:+PrintGCDetails) GC overhead limit exceeded: gc占用98%的资源回收效率不足2%的(-Xms30m -Xmx30m) Metaspace:方法区异常----(XX:MetaspaceSize=10M -XX:...

    weblogic优化指南.pdf

    垃圾收集(GC)是指JVM释放Java堆中不再使用的对象所占用的内存的过程,而Java堆(Heap)是指Java应用程序对象生存的空间。堆大小决定了GC的频度和时间。堆越大,GC频度低,速度慢。堆越小,GC频度高,速度快。所以GC和堆大小...

    关于java堆内存溢出的几种情况

     java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环;  如果是java堆内存不够的话,可以通过调整JVM下面的配置来解决:  <jvm>-Xms3062m</...

    超硬核!!!一篇文章搞定整个JVM运行时数据区

    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 本地...

Global site tag (gtag.js) - Google Analytics