一 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收集器:以获取最短停留时间,基于标记清除
未完待续
网友评论