JVM虚拟机
JVM执行流程
编辑代码 >>> 生成.class可执行 >>> 类装载子系统 >>> 运行时数据区(内存模型) >>> 字节码执行引擎
内存模型
栈
- 基本类型的变量和对象的引用变量
名称 | 内容 |
---|---|
局部变量表 | 存放局部变量 |
操作数栈 | 存放临时的操作数区域 |
动态链接 | 部分符号引用在运行期间转化为直接引用 |
方法出口 | 方法的结束 |
堆
- 开辟内存空间,创建对象
方法区
- 常量 + 静态变量 + 类信息
本地方法栈
-
native
修饰,底层C语言实现的 -
本地方法栈运行的区域**(例如:
加减操作
)**
程序计数器
- 最经典的示例:多线程挂起,从一个线程转化为另外一个线程的时候,如何判断从何处开始,这时候需要用到程序计数法
垃圾回收机制
可达性分析算法
- 将"
gc roo
t"作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象,gc roots
根节点: 线程栈的本地变量,静态变量,本地方法栈等
引用计数器
为每个对象创建一个引用计数,有对象引用时计数器+1,引用被释放时计数-1,当计数器为0时就可以被回收,它有一个缺点不能解决循环引用的问题
垃圾回收算法
标记-清除算法
缺点:标记清除后会产生大量不连续的内存碎片
复制算法
缺点:效率高但是极其浪费内存空间
标记整理算法
缺点:效率低,存活对象会经常性的移动位置
分代回收算法
新生代垃圾回收一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收
年轻代:
- 1、把Eden+From Survivor存活对象放入To Survivor区
- 2、清空Eden+ From Survivor 分区
- 3、From Survivor和To Survivor分区交换,From Survivor变To Survivor,To Survivor 变 From Survivor
- 4、每次From Survivor 到To Survivor移动时都存活的对象,年龄就+1,当年了到达15(默认)时,升级为老年代,大对象也会直接进入老年代
- 5、老年代当空间占用到达某个值之后就会触发全局垃圾回收,一般使用标记整理的执行算法
动态对象判断机制
- 当回收的垃圾到达from survivor并且大于 from survivor(s0)内存的一半,自动放入老年代
Java虚拟机调优的目的
STW
- 停止服务器清理垃圾,一般适用于 老年代 中,老年代进行垃圾回收时服务器会阻塞,缓慢进行
Java虚拟机调优的目的
- 减少
STW
(减少老年代垃圾回收的处理时间,或者排除javaBean
以外的资源进入老年代)
ok,打完收工,感谢大家点赞评论,如有不足之处,还望各位大大批评指正
关注博客爵士,欢迎各位大大光临(大数据,python,java,操作系统)
http://www.yazz.top/