java jvm学习

jvm区域整体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)Tenured Gen(老年代-养老区)。 heap区又分:Code Cache(代码缓存区)Perm Gen(永久代)、Jvm Stack(java虚拟机栈)Local Method Statck(本地方法栈) php

HotSpot虚拟机GC算法采用分代收集算法: html

1、一我的(对象)出来(new 出来)后会在Eden Space(伊甸园)无忧无虑的生活,直到GC到来打破了他们平静的生活。GC会逐一问清楚每一个对象的状况,有没有钱(此对象的引用)啊,由于GC想赚钱呀,有钱的才能够敲诈嘛。而后富人就会进入Survivor Space(幸存者区),穷人的就直接kill掉。 java

2、并非进入Survivor Space(幸存者区)后就保证人身是安全的,但至少能够活段时间。GC会按期(能够自定义)会对这些人进行敲诈,亿万富翁每次都给钱,GC很满意,就让其进入了Genured Gen(养老区)。万元户经不住几回敲诈就没钱了,GC看没有啥价值啦,就直接kill掉了。 算法

3、进入到养老区的人基本就能够保证人身安全啦,可是亿万富豪有的也会挥霍成穷光蛋,只要钱没了,GC仍是kill掉。 数组

分区的目的:新生区因为对象产生的比较多而且大都是朝生夕灭的,因此直接采用标记-清理算法。而养老区生命力很强,则采用复制算法,针对不一样状况使用不一样算法。 缓存

heap区域中Perm Gen中放着类、方法的定义,jvm Stack区域放着方法参数、局域变量等的引用,方法执行顺序按照栈的先入后出方式。 安全

 

以上各类GC机制是须要组合使用的,指定方式由下表所示: jvm

 

源文档 <http://blog.163.com/guixl_001/blog/static/4176410420108296361891/> 学习

 

 

 

源文档 <http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29632145&id=4616836> ui

 

 

回到问题“为什么会内存溢出?”。

要回答这个问题又要引出另一个话题,既什么样的对象GC才会回收?固然是GC发现经过任何reference chain(引用链)没法访问某个对象的时候,该对象即被回收。名词GC Roots正是分析这一过程的起点,例如JVM本身确保了对象的可到达性(那么JVM就是GC Roots),因此GC Roots就是这样在内存中保持对象可到达性的,一旦不可到达,即被回收。一般GC Roots是一个在current thread(当前线程)call stack(调用栈)上的对象(例如方法参数和局部变量),或者是线程自身或者是system class loader(系统类加载器)加载的类以及native code(本地代码)保留的活动对象。因此GC Roots是分析对象为什么还存活于内存中的利器。知道了什么样的对象GC才会回收后,再来学习下对象引用都包含哪些吧。

 

源文档 <http://www.blogjava.net/rosen/archive/2010/05/21/321575.html>

 

从最强到最弱,不一样的引用(可到达性)级别反映了对象的生命周期。

l  Strong Ref(强引用):一般咱们编写的代码都是Strong Ref,于此对应的是强可达性,只有去掉强可达,对象才被回收。

l  Soft Ref(软引用):对应软可达性,只要有足够的内存,就一直保持对象,直到发现内存吃紧且没有Strong Ref时才回收对象。通常可用来实现缓存,经过java.lang.ref.SoftReference类实现。

l  Weak Ref(弱引用):比Soft Ref更弱,当发现不存在Strong Ref时,马上回收对象而没必要等到内存吃紧的时候。经过java.lang.ref.WeakReferencejava.util.WeakHashMap类实现。

l  Phantom Ref(虚引用):根本不会在内存中保持任何对象,你只能使用Phantom Ref自己。通常用于在进入finalize()方法后进行特殊的清理过程,经过 java.lang.ref.PhantomReference实现。

 

有了上面的种种我相信很容易就能把heapperm gen撑破了吧,是的利用Strong Ref,存储大量数据,直到heap撑破;利用interned strings(或者class loader加载大量的类)把perm gen撑破。

 

 

源文档 <http://www.blogjava.net/rosen/archive/2010/05/21/321575.html>

 

Shallow size就是对象自己占用内存的大小,不包含对其余对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。在32位系统上,对象头占用8字节,int占用4字节,无论成员变量(对象或数组)是否引用了其余对象(实例)或者赋值为null它始终占用4字节。故此,对于String对象实例来讲,它有三个int成员(3*4=12字节)、一个char[]成员(1*4=4字节)以及一个对象头(8字节),总共3*4 +1*4+8=24字节。根据这一原则,对String a=rosen jiang”来讲,实例ashallow size也是24字节

 

源文档 <http://www.blogjava.net/rosen/archive/2010/05/21/321575.html>

相关文章
相关标签/搜索