如果不是那次面试,你也许不会意识到jvm的重要性

  1. 本博客已迁移至微信公众号!将不再更新
  2. 关注公众号即可获得免费学习资源,获得免费指导!!!
  3. 公众号后续将会持续更新clickhouse,sparkstreaming,flink,数仓建模,用户画像,实时计算,推荐系统,实时数仓等内容,感兴趣的朋友可以关注
  4. 不定期会有朋友的面经分享

 

 

 JVM它是Java Virtual Machine 的缩写,主要是通过在实际计算机模仿各种计算机功能来实现的,组成部分包括堆、方法区、栈、本地方法栈、程序计算器等,其中方法回收堆和方法区是共享区,也就是谁都可以使用,而栈和程序计算器、本地方法栈区是归JVM的。Java能够被称为“一次编译,到处运行”的原因就是Java屏蔽了很多的操作系统平台相关信息,使得Java只需要生成在JVM虚拟机运行的目标代码也就是所说的字节码,就可以在多种平台运行。

一.运行时数据区域

  • 程序计数器

       它是程序控制流的指示器,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成

  • java虚拟机栈

    每个方法被执行的时候,java虚拟机都会同步创建一个栈帧用于存储局部变量表,操作数栈,动态连接,方法出口等信息

    每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程

    局部变量表;方法中定义的变量与方法的参数,

    操作数栈;压栈出栈存放数据的地方,

    动态连接;这个的作用就是知道谁调用的,比方说java中的多态,最后会知道具体是哪个类,

  • 本地方法栈

   与虚拟机栈所发挥的所用是非常相似的,其区别只是虚拟机栈为虚拟机执行java方法(也就是字节码)服务,而本地方法栈则是 为虚拟机使用到的本地(Native)方法服务

  • java堆(也称GC堆)

java堆是虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放实例对象,java世界里几乎所有的对象实例都在这里分配内存(所有的对象实例及数组都应当在堆上分配)

  • 方法区

用于存储已被虚拟机加载的类型信息,常量,静态变量,即时编译器编译后的代码缓存等数据

二.垃圾收集器与内存分配策略

2.1 如何判断对象已死

  • 引用计数法

在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一,当引用失效时,计数器值就减一,任何时刻计数器为0的对象就是不可能再被使用的

但是此算法难以解决对象之间的相互循环引用的问题

  • 可达性分析算法

这个算法的基本思路就是通过一系列称为GC ROOT的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为”引用链”,如果某个对象到GC ROOTs间没有任何引用链相连,或者用图论的话来说就是从GC ROOT到这个对象不可达时,则证明此对象是不可能再被使用的

2.2 垃圾收集算法

  • 标记-清除算法

算法分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。标记过程就是对象是否属于垃圾的判定过程,前面已经介绍过了。

缺点:

执行效率不稳定

如果java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低

内存空间的碎片化问题

标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当以后再程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前出发另一次垃圾收集动作。

标记-清除算法过程如图所示:

  • 标记-复制算法

 标记-复制算法常被简称为复制算法,为了解决标记-清楚算法面对大量可回收对象时执行效率低的问题

它将可用内存按容量划分为大小相等的两块,每次只是用其中的一块。当这一块的内存用完了,就将还存活这的对象复制到另一块上面,然后再把自己已使用过的内存空间一次清理掉。

如果内存中多数对象是存活的,这种算法将回产生大量的内存间复制的开销,但对于多数对象都是可回收的情况,算法需要复制的就是占少数的存活对象

缺点:

这种复制回收算法的代价是将可用内存缩小为了原来的一般,空间浪费未免太多了一点

标记-复制算法的执行过程:

  • 标记-整理算法

标记-整理算法,其中的标记过程仍然与 标记-清除 算法一样,但后续步骤不是直接对可回收对象进行整理,而是让所有存活的对象都像内存空间一端移动,然后直接清理掉边界以外的内存

如图所示:

2.3 经典垃圾收集器

并行收集:多个线程一起收集

并发收集:跟用户线程一起跑

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据私房菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值