深入理解java虚拟机

2018-04-29  本文已影响0人  sunshaohua520

一 java内存区域与内存溢出

程序计数器:当前线程执行行号,线程私有

虚拟机栈:存储局部变量表(基本类型和对象引用)、操作栈、动态链接等

本地方法栈:为虚拟机使用到的本地方法(Native)服务

堆:对象实例,GC主要活动区域

方法区:存储被加载的类的信息、常量、静态变量、即时编译后的代码等

运行时常量池:存储编译器产生的字面量和符号引用,也可能是运行时产生的常量,如string的intern()

对象访问:主流两种方式:句柄,直接指针,句柄优点:对象移动时直接修改引用,直接指针优点:访问速度快,sun hotspot 采用直接指针

异常:堆溢出异常 java heap space   栈溢出 stackOverflowError  方法去溢出(含常量池溢出)PermGen space

二垃圾收集器与内存分配策略

对象死的标准:引用计数法、可达性分析法

再谈引用:强引用:引用关系一直存在,不gc, 软引用:下次溢出之前gc ,弱引用:下次gc时gc ,虚引用:设置的目的是希望gc时收到系统通知

垃圾收集算法:标记-清除法 缺点:空间问题、产生大量不连续碎片。效率低。复制算法:空间分相等两块,其中一块满即将存活对象复制另一块,再清除。标记整理法:和标记清除一样,不同是将存活对象移至另一端,清除以外内存。

分代收集:新生代 老生代:堆分为新生代老生代 比例1:2,新生代又分为eden和2个survivor 比例为8:1:1,新生代采用复制算法,将eden和其中一个survivor(from)存活对象移至另一个survivor(to),每次to,对象加1,超过设置(默认15 可通过-XX:MaxTenuringThreshold设定)移到老年代,老年代采用标记算法

垃圾收集器:

    serial收集器,单线程扫描,适用于单cpu新生代空间小、暂停要求不高

    parNew收集器:多线程收集,适用于多CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式

    parallel Scanvenge收集器:新生代收集器使用复制算法并行收集,高吞吐量,适用于后台运算不需要太多交互

    serial old 收集器:

    parallel old 收集器:

    cms收集器:以获取最短停留时间,基于标记清除

未完待续

上一篇下一篇

猜你喜欢

热点阅读