【2020-面试实战】-JVM

1 JVM 与 JMM

JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。

从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。线程在本地副本中操作完成之后会将值刷新回主内存中;

线程中的私有内存对其它线程不可见,但是主内存中的数据对所有线程都是可见且共享的

2 JVM内存结构划分以及存储内容

在这里插入图片描述
注意:新生代与老年代的比例是 1:2
Eden S0 S1的比例是 8:1:1

3 谈谈JVM的垃圾回收机制,你们生产上用的哪一种?为什么?

说一下什么是垃圾+如何判断对象是否能被回收(引用计数,GC Roots(可能会引出GC Roots))+四大垃圾回收算法+7大垃圾收集器+公司用的CMS或者G1+该收集器的优点

首先我们知道,内存中已经不再被使用到的空间就是垃圾,就需要被回收.
JVM判断一个对象是否可以被回收的依据是引用计数法和GC Roots,并且引用计数法已经不再使用.
JVM垃圾回收主要靠引用计数,复制,标记清除,标记整理这四种算法
以及应用在新生代的串行(Serial),并行(Parallel),并发(ParNew),老年代的串行(serial old),并行(parallel old),并发(CMS)垃圾收集器,以及最新的G1垃圾收集器;
系统中使用的是CMS垃圾收集器, 并发收集低停顿

4 说一下GC Roots

枚举根节点做可达性分析(根搜索路径算法)
为了解决引用计数法的循环引用问题, Java使用了可达性分析的方法,也就是我们说的GC Roots
所谓GC Roots, 就是一组必须活跃的引用
通过GC Roots作为起始点,开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用

也就是说我们需要给定一个集合的引用作为根触发,通过引用关系,遍历对象图,能被遍历到的对象被判定为存活,没有被遍历到的就自然被判定为死亡;

4.1 Java中可以被作为GC Roots的对象
  • 虚拟机栈(栈帧中的局部变量区,也叫局部变量表)中引用的对象
  • 方法区中的类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方发栈中(Native方法)引用的对象

5 介绍下CMS和G1 垃圾回收器 随便说下它们的区别

CMS(Concurrent Mark Sweep 并发标记清除) 并发垃圾收集器,是一种获取最短回收停顿时间为目标的收集器,非常适合堆内存大,CPU核数多的服务器端应用,也是G1出现之前大型应用的首选收集器
其优点就是并发收集低停顿,缺点就是并发执行,对CPU的资源压力大,采用标记清除算法会导致大量碎片
G1收集器,是为了取代CMS,其整体采用标整算法,局部采用复制算法. 相比CMS其,是一个有整理内存过程的垃圾收集器, 不会产生很多内存碎片. 其STW更可控;
最大区别:是 Eden, Survivor和Tenured等内存区域不再是连续的了,而是变成了一个个大小不一样的region. 每个region从1M到32M不等.一个region有可能属于Eden, Survivor或者Tenured内存区域;

6 JVM中常用基本配置参数

-Xms128m -Xmx4096m -Xss1024k -XX:MetaspaceSize=512m -XX:PrintCommandLineFlags -XX+PrintGCDetails -XX:+UseG1

  • -Xms:初始默认大小内存,默认为物理内存1/64 等价于 -XX:InitialHeapSize
  • -Xmx:最大分配内存,默认为物理内存1/4 等价于 -XX:MaxHeapSize
  • -Xss:设置单个线程栈的大小,一般默认512k-1024k, 等价于 -XX:ThreadStackSize
  • -XX:MetaspaceSize 设置元空间的大小,一般设1024M

7 谈谈 OOM

OutOfMemoryError
主要是虚拟机方面出现的错误,有

  • java.lang.StackOverflowError 深度的方法调用(递归调用,方法过多),把栈空间给撑爆了
  • java.lang.OutOfMemoryError:Java heap space 堆内存空间不足
  • java.lang.OutOfMemoryError:GC overhead limit exceeded GC回收时间过长会抛出以上错误 超过98%的时间用来做GC,回收了不到2%的空间
  • java.lang.OutOfMemoryError:Direct buffer memory 直接内存撑爆
  • java.lang.OutOfMemoryError:unable to create new native thread 无法创建更多本地线程
  • java.lang.OutOfMemoryError:Metaspace元空间被撑爆
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值