java-jvm笔记

分类: Java

(栈管运行,堆管存储)
class 文件 类装载器

运行时区域
方法区 虚拟机栈 本地方法栈
堆 程序计数器

执行引擎 本地库接口 本地方法库 GC回收器

栈中主要保存3类数据:本地变量,栈操作,栈帧数据。
栈中的数据以栈帧的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法和运行期数据的数据集。

线程共享的数据区只有 堆 和方法区

三种jvm
sun公司的hotspot
bea公司的jRockit
ibm的 J9 vm

堆内存示意
1新生区
伊甸区
幸存0区
幸存1区

2养老区
用于保存从新生区筛选出来的java对象,一般池对象都在这个区域活跃。

3永久存储区
是一个常驻内存区域,用于存放jdk自身所携带的class,interface的元数据,它存储的是运行环境必须的类信息,此区域的数据不会被垃圾回收器回收,关闭jvm才会释放此区域所占用的内存。

java.lang.OutOfMemoryError:java head space
说明堆内存不够,原因有二:
1.java虚拟机的堆内存设置不够,可以通过 -Xms -Xmx来调整。
2.代码中拆功能键了大量大对象,并且长时间不能被垃圾收集器收集(存在被引用)

java.lang.OutOfMemoryError:PermGen space,说明java虚拟机对永久代Perm内存设置不够。
一般出现这种情况,都是程序启动需要加载大量的第三方jar。例如,在一个tomcat部署太多的应用,或者大量的动态反射生成的类不断被加载,做种导致perm区被沾满。

jdk1.6之前:有永久代,常量池1.6在方法区
jdk1.7: 有永久代,但已经逐步“去永久代”,常量池1.7在堆
jdk1.8及之后:无永久代,常量池1.8在元空间。

-Xms 设置初始分配大小,默认为物理内存的1/64
-Xmx 最大分配内存,默认为物理内存的1/4
-XX:+PrintGCDetails 输出详细的GC日志

GC是什么
频繁手机Young区
较少手机Old区
基本不懂Perm区

GC三大算法:
复制
标记清除
标记整理

普通GC一般发生在新生代,用的是复制算法
HOTSPOT将年轻代分为Eden和2个Survior区,比例为8:1:1,
复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另一块上面,复制算法不回产生内存碎片。
优势:不会产生碎片。弥补了标记/清除算法中,内存布局混乱的缺点。
劣势:浪费空间。复制算法想要使用,对象的存活率要非常低才行,最重要的是要克服50%内存的浪费。

老年代 一般是由标记清除或者是标记清除与标记整理的混合实现。
标记清除(Mark-Sweep):
从根集合开始扫描,对存活对象标记;扫描整个空间,回收未被标记对象。
两次扫描,耗时严重。会产生内存碎片。
优点:不需要额外空间。
标记整理(Mark-Compact):
标记/整理算法唯一的缺点就是效率不高,不仅要标记所有存活对象,还要整理所有存活对象的引用地址。从效率上来说,标记/整理算法要低于复制算法。

内存效率: 复制算法>标记清除算法>标记整理算法(此处的效率只是简单的对比时间复杂度,实际情况不一定如此)
内存整齐度: 复制算法=标记整理算法>标记清除算法
内存利用率: 标记整理算法=标记清除算法>复制算法

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注


Warning: error_log(/www/wwwroot/codegulu.cn/wp-content/plugins/spider-analyser/#log/log-1014.txt): Failed to open stream: Permission denied in /www/wwwroot/codegulu.cn/wp-content/plugins/spider-analyser/spider.class.php on line 2969