关于JVM的问题

1、内存模型以及分区,需要详细到每个区放什么。

JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面,class
类信息常量池(static 常量和 static 变量)等放在方法区
new:
 方法区:主要是存储类信息,常量池(static 常量和 static 变量),编译后的代码(字
节码)等数据
 堆:初始化的对象,成员变量 (那种非 static 的变量),所有的对象实例和数组都要
在堆上分配
 栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操作
数栈,方法出口等信息,局部变量表存放的是 8 大基础类型加上一个应用类型,所以还
是一个指向地址的指针
 本地方法栈:主要为 Native 方法服务
 程序计数器:记录当前线程执行的行号

2. 堆里面的分区:Eden,survival (from+ to),老年代,各自的特点。

堆里面分为新生代和老生代(java8 取消了永久代,采用了 Metaspace),新生代包含
Eden+Survivor 区,survivor 区里面分为 from 和 to 区,内存回收时,如果用的是复制
算法,从 from 复制到 to,当经过一次或者多次 GC 之后,存活下来的对象会被移动到
老年区,当 JVM 内存不够用的时候,会触发 Full GC,清理 JVM 老年区
当新生区满了之后会触发 YGC,先把存活的对象放到其中一个 Survice
区,然后进行垃圾清理。因为如果仅仅清理需要删除的对象,这样会导致内存碎
片,因此一般会把 Eden 进行完全的清理,然后整理内存。那么下次 GC 的时候,
就会使用下一个 Survive,这样循环使用。如果有特别大的对象,新生代放不下,
就会使用老年代的担保,直接放到老年代里面。因为 JVM 认为,一般大对象的存
活时间一般比较久远

3、GC 的两种判定方法:

引用计数法:指的是如果某个地方引用了这个对象就+1,如果失效了就-1,当为 0 就会
回收但是 JVM 没有用这种方式,因为无法判定相互循环引用(A 引用 B,B 引用 A)的
情况
引用链法: 通过一种 GC ROOT 的对象(方法区中静态变量引用的对象等-static 变量)
来判断,如果有一条链能够到达 GC ROOT 就说明,不能到达 GC ROOT 就说明可以
回收

4、GC 的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在

什么地方,如果让你优化收集方法,有什么思路?
先标记,标记完毕之后再清除,效率不高,会产生碎片
复制算法:分为 8:1 的 Eden 区和 survivor 区,就是上面谈到的 YGC
标记整理:标记完毕之后,让所有存活的对象向一端移动

5、GC 收集器有哪些?CMS 收集器与 G1 收集器的特点。

并行收集器:串行收集器使用一个单独的线程进行收集,GC 时服务有停顿时间
串行收集器:次要回收中使用多线程来执行
CMS 收集器是基于“ 标记— 清除”算法实现的,经过多次标记才会被清除
G1 从 整体来看是基于“ 标记— 整理”算法实现的收集器,从 局部(两个 Region 之间)
上来看是基于 上来看是基于“ 复制”算法实现的

6、Minor GC 与 Full GC 分别在什么时候发生?

新生代内存不够用时候发生 MGC 也叫 YGC,JVM 内存不够的时候发生 FGC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值