分享

hotspot JVM内存模型与常用调优参数

 dtl乐学馆 2015-04-14
作者:DTL

关于内存模型,已经有大把文章说了,这里我就简单扼要的说下,写此文仅仅是读书笔记而已。

一、内存模型及内容
对hotspot而言分为5个部分,IBM的vm先不提。
1.方法区,也可称为永久代
主要存放常量,有个常量池
静态变量
既然是方法区,当然还有“类相关信息”
2.堆,又称gc堆,可别叫垃圾堆哦^^
对是gc回收的重点区域,因为gc堆里“几乎存放了所有对象与数组”,数组也是对象。注意是几乎,如果是1.4以前可 以说是绝对,现在随着技术的发展已经不绝对了,这里不赘述了。
3.栈,jvm栈
存放局部变量
编译期可以确定值的基本数据类型4类8种;short,byte,int,long;double,float,char,boolean
4.本地栈native栈其实不受jvm管控的,存放本地方法相关的信息
5.程序计数器区,很小很总要。当前class字节码执行的行号指示器。分支,循环,跳转,异常处理,线程等等都依赖程序计数器来完成。

二,谈谈gc堆
垃圾回收是java的最大特点,堆又是gc回收的重点区域,所以要说下
1.如何确定对象是否被引用,是否已死?
这是回收的前提,不被引用的对象才可以回收吗,这里我就直接说了,采用的是“根搜索算法”,直白的讲就是有个“gcRoots”的对象,从图论的角度来说就是,判断gcRoots和指定对象间是否可达!可达就是被引用了,不能回收。否则可以判定为没被引用,再进行下一步。
2.引用种类:
强,软,弱,虚
凡是通过new关键字直接创建的对象都是强引用,不可回收;
软引用是指在gc回收前,判断内存是否足够,回收了内存还不够,则报oom异常,软引用通过softReference类创建。
弱每次必回收,通过weakReference创建的
虚引用又叫幽灵引用,基本没影响,每次必回收,回收了只发一个通知而已。PhantomReference类来实现。
3.知道了引用,是否已死,那么来回收吧
“分代收集算法”,堆划分为“年轻代”,“年老代”,方法区为“永久代”也是要回收的。
年轻代采用“复制算法回收”即:分Eden区,两个survivor区,哎简单写,我还要睡觉呵呵。
每次Eden和一个survivor区进行回收,发现没死的对象,复制到另一个survivor区,剩下的一次性回收了。年轻代的一般都是“朝生夕死”。由于不能判断出活着的对象大小,当超过另一个survivor区大小时,默认eden:survivor=8:1,可以调哦。讲多余的放到老年代。
老年代采用“标记-清理算法”,听名字也知道怎么个算法了。

三,调优
栈:会抛出两个异常:stackOverFlowError和OutOfMemoryError异常
参数:-Xss
堆:OutOfMemoryError异常
参数: -Xms     -Xmx 最小最大堆
方法区:OutOfMemoryError异常,一般会写“OutOfMemoryError:PermGen space”
参数:-XX:PermSize和-XX:PermMaxSize
其他区域也都是OOM异常,参数要查,不写了。

后续在写,暂停睡觉呵呵

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多