JVM虚拟机原理及JVM调优

JVM虚拟机

JVM执行流程

编辑代码 >>> 生成.class可执行 >>> 类装载子系统 >>> 运行时数据区(内存模型) >>> 字节码执行引擎

image-20200605215453359

内存模型

  • 基本类型的变量和对象的引用变量
名称内容
局部变量表存放局部变量
操作数栈存放临时的操作数区域
动态链接部分符号引用在运行期间转化为直接引用
方法出口方法的结束

  • 开辟内存空间,创建对象

方法区

  • 常量 + 静态变量 + 类信息

本地方法栈

  • native修饰,底层C语言实现的

  • 本地方法栈运行的区域**(例如:加减操作)**

程序计数器

  • 最经典的示例:多线程挂起,从一个线程转化为另外一个线程的时候,如何判断从何处开始,这时候需要用到程序计数法

垃圾回收机制

可达性分析算法

  • 将"gc root"作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象, gc roots 根节点: 线程栈的本地变量静态变量本地方法栈等
    可达性分析算法

引用计数器

​ 为每个对象创建一个引用计数,有对象引用时计数器+1,引用被释放时计数-1,当计数器为0时就可以被回收,它有一个缺点不能解决循环引用的问题

垃圾回收算法

标记-清除算法

缺点:标记清除后会产生大量不连续的内存碎片

image-20200605214757157

复制算法

缺点:效率高但是极其浪费内存空间

image-20200605214816735

标记整理算法

缺点:效率低,存活对象会经常性的移动位置

image-20200605214924640

分代回收算法

新生代垃圾回收一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收

年轻代:

  • 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、老年代当空间占用到达某个值之后就会触发全局垃圾回收,一般使用标记整理的执行算法

image-20200605215214894

动态对象判断机制
  • 当回收的垃圾到达from survivor并且大于 from survivor(s0)内存的一半,自动放入老年代

Java虚拟机调优的目的

STW

  • 停止服务器清理垃圾,一般适用于 老年代 中,老年代进行垃圾回收时服务器会阻塞,缓慢进行

Java虚拟机调优的目的

  • 减少STW(减少老年代垃圾回收的处理时间,或者排除javaBean以外的资源进入老年代)

image-20200605214133240

ok,打完收工,感谢大家点赞评论,如有不足之处,还望各位大大批评指正

关注博客爵士,欢迎各位大大光临(大数据,python,java,操作系统)
http://www.yazz.top/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值