jvm内存结构
运行时方法区,包含以下几个部分
方法区:保存每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等
java栈 :保存有局部变量表、操作数栈、指向运行时常量池的引用、方法返回地址
本地方法栈:保存本地方法执行需要信息,为本地方法服务
程序计数器:用来指示执行哪条指令的
堆:保存对象本身的以及数组
注:堆和方法区为线程共享区 java栈、本地方法栈、程序计数器为线程私有
jvm相关参数
-Xms 堆初始大小 ,一般Xms与Xmx一致
-Xmx 堆最大值
-Xmn 新生代大小
-Xss 每个线程的stack大小(栈)
查看堆内存使用情况命令:jmap -heap 3183
查看Gc情况命令:jstat -gcutil 3183
其它命令见:JVM学习—-查看堆栈信息
jvm垃圾回收 GC
什么样的对象可以被回收
引用计数法
在对象上添加一个引用计数器,每当有一个对象引用它时,计数器加1,当使用完该对象时,计数器减1,计数器值为0的对象表示不可能再被使用。
优点:实现简单,判定高效
缺点:不能解决对象之间相互引用的问题
可达性分析 (java使用这种方式判定对象是否可被回收)
通过一系列称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,搜索路径称为 “引用链”,以下对象可作为GC Roots:
- 本地变量表中引用的对象
- 方法区中静态变量引用的对象
- 方法区中常量引用的对象
- Native方法引用的对象
当一个对象到 GC Roots 没有任何引用链时,意味着该对象可以被回收。
如图:
在可达性分析法中,判定一个对象objA是否可回收,至少要经历两次标记过程:
1、如果对象objA到 GC Roots没有引用链,则进行第一次标记。
2、如果对象objA重写了finalize()方法,且还未执行过,那么objA会被插入到F-Queue队列中,由一个虚拟机自动创建的、低优先级的Finalizer线程触发其finalize()方法。finalize()方法是对象逃脱死亡的最后机会,GC会对队列中的对象进行第二次标记,如果objA在finalize()方法中与引用链上的任何一个对象建立联系,那么在第二次标记时,objA会被移出“即将回收”集合。
项目中不建议使用finalize
回收算法
Mark-Sweep标记-清除
分为标记阶段 清除阶段
优点:实现简单
缺点:容易造成内存碎片
Copying复制算法
将内存分为大小相等的两块 ,将存活的对象复制到另一块,清理原来的一块
优点:解决内存碎片问题
缺点:使可用内存缩减为1半
Mark-Compact(标记-整理)算法
该算法标记阶段和Mark-Sweep一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存
Generational Collection(分代收集)算法 JVM使用算法
该算法将堆内存分为几块
新生代(Young):新生代分为 Eden(伊甸园),Survivor(幸存者),大小比例为8:1,幸存者区有两个,即伊甸园占新生代的8/10
老年代(Old) :大小为Xmx-Xmn(堆大小-新生代大小)
新生代发生GC(Minor GC)
新生代没次有大量对象被回收,适合使用复制算法将伊甸园和一个幸存者区的存活对象复制到另一个幸存者区,清理伊甸园和第一个幸存者区
老年代GC
老年代被回收对象比较少,适合使用Mark-Compact(标记-整理)算法,当老年代的空间不足时,会触发Major GC/Full GC
永久代:类的元数据如方法数据、方法信息(字节码,栈和变量大小)、运行时常量池、已确定的符号引用和虚方法表等被保存在永久代中,32位默认永久代的大小为64M,64位默认为85M,可以通过参数-XX:MaxPermSize进行设置,一旦类的元数据超过了永久代大小,就会抛出OOM异常。
注:虚拟机团队在JDK8的HotSpot中,把永久代从Java堆中移除了,并把类的元数据直接保存在本地内存区域(堆外内存),称之为元空间。
优点:对永久代的调优过程非常困难,永久代的大小很难确定,其中涉及到太多因素,如类的总数、常量池大小和方法数量等,而且永久代的数据可能会随着每一次Full GC而发生移动。在JDK8中,类的元数据保存在本地内存中,元空间的最大可分配空间就是系统可用内存空间,可以避免永久代的内存溢出问题
缺点:需要监控内存的消耗情况,一旦发生内存泄漏,会占用大量的本地内存
ps:JDK7之前的HotSpot,字符串常量池的字符串被存储在永久代中,因此可能导致一系列的性能问题和内存溢出错误。在JDK8中,字符串常量池中只保存字符串的引用。
参考资料
http://mp.weixin.qq.com/s/gQQuoy8XRVwKYdl8cmgXhA
https://www.cnblogs.com/xuejiangbo/p/6686619.html
http://www.importnew.com/19085.html
http://www.jianshu.com/p/6d1cbe38a54b