关于JVM高级特性的总结
Posted woniufei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于JVM高级特性的总结相关的知识,希望对你有一定的参考价值。
1.在JVM中有一块很重要的内容-------内存管理
内存管理中又有--------运行时数据区域
方法区(method area) || 虚拟机栈(VM stack) 本地方法栈 (native method stack)
||
堆(heap) || 程序计数器(program counter register):程序一行一行的执行,就归功于这一部分(你可理解为程序 行数)
||
2.java虚拟机栈:每个方法在被调用时就会创建一个栈帧,每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中到出栈的过程(-Xss)
3.java堆:是java虚拟机所管理的内存中最大的一块。java堆是被所有线程共享的一块内存区域,几乎所有的对象实例都在这里分配内存。(注意这里的修饰词是几乎,那么什么对象实例不在这里分配呢??? class类)是垃圾收集器(GC)管理的主要区域(-Xms;-Xmx;-Xmn)
4.方法区:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,运行时常量池(runtime constant pool)是方法区的一部分。(-XX:permSize)
5.直接内存:并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域。
-------------------------说了那么多 ,看了那么多 ,上干货-------------------------
来点内存溢出看看
1. java堆溢出
2.方法区和运行时常量池溢出
3.虚拟机栈和本地方法栈溢出
4.本机直接内存溢出
垃圾收集器与内存分配策略
1.GC要做的事?
1.where/which ? 2. when? 3. how?
在运行时数据区域中 谁需要GC?
很显然根据栈的原理 对于类加载都是先进入后出 换言之类操作完成后自动清理,从内存中释放掉了。因此不需要GC
而堆和方法区是需要的
2.那在程序中如何判断对象是否存活?也就是判断哪学是需要GC区处理的
1.引用计数算法
就是对象每次被引用都+1 如果是0那就表示没有被引用可清理。
但是这种方法存在缺陷,如果两个对象互相引用,会陷入死循环。
2.可达性分析
GC roots
|
obj1 obj4
| |
--------- -------
| | | |
obj2 obj3 obj5 obj6
根节点roots到达不了obj4 应该判定为obj4及其子节点为可回首对象
3.标记--清除算法
缺点:碎片化
4.复制算法
缺点:内存最大使用率只有百分之五十,浪费空间
5.标记--整理算法
缺点:速度慢
实际开发将这三种清除算法结合使用
6.新生代 --- 老年代
新生代适合用--复制算法
老年代---标记清除和标记整理算法
以上是关于关于JVM高级特性的总结的主要内容,如果未能解决你的问题,请参考以下文章
JVM高级特性与实践(十三):线程实现 与 Java线程调度