JVM 面试题

在这里插入图片描述
JVM位置
JVM的体系结构
类加载器
双亲委派机制
沙箱安全机制
Native
PC寄存器
方法区

三种JVM
新生区、老年区
永久区
堆内存调优
GC
JMM

JVM是如何运行起来的?对象是如何分配?

在这里插入图片描述
比如说我们有一个类里面包含了一个main方法,你去执行这个main方法,此时会自动一个jvm进程,他会默认就会有一个main线程,这个main线程就负责执行这个main方法的代码,进而创建各种对象

tomcat,类都会加载到jvm里去,spring容器而言都会对我们的类进行实例化成bean,有工作线程会来执行我们的bean实例对象里的方法和代码,进而也会创建其他的各种对象,实现业务逻辑

在这里插入图片描述

JVM的年轻代垃圾回收算法?对象什么时候转移到老年代?

如果说你让代码一边运行,一边有变动,一边判断哪些对象是可以回收的,这个是不现实的,垃圾回收的时候有一个概念,叫做stop the world,停止你的jvm里的工作线程的运行,然后扫描所有的对象,判断哪些可以回收,哪些不可以回收的。

年轻代,大部分情况下,对象生存周期是很短的,可能在0.01ms之内,线程执行了3个方法,创建了几个对象,0.01ms之后就方法都执行结束了,此时那几个对象就会在0.01ms之内变成垃圾,可以回收的。

100个对象,可能90个对象都是垃圾对象,10个对象是存活的对象。

年轻代的垃圾回收,使用复制算法,一次young gc。

对象什么时候转移到老年代:

  • 长期存活的对,经历了15次垃圾回收
  • s区放不下的对象,比如一次young gc存活下来的对象,放不下s区,会进入老年代
  • 大对象,比如说有一个对象自己就有100MB

Spring容器里,对每个bean实例对象就一个,长期存活,一直给我们来使用
在这里插入图片描述

老年代的垃圾回收算法?常用的垃圾回收器都有什么?

老年代对象越来越多,是不是会发现说,老年代的内存空间也会满的,老年代很多都是被长期引用的,Spring容器管理的各种bean。

对老年代而言,他里面垃圾对象可能是没有那么多的,标记-清理,找出来那些垃圾对象,然后直接把垃圾对象在老年代里清理掉,会存在内存碎片,标记-整理,把老年代里的存活对象标记出来,移动到一起,存活对象压缩到一片内存空间里去,解决了内存碎片的一个问题。

parnew+cms的组合
g1主要适用于大内存机器

parnew 年轻代使用的回收垃圾器,使用多线程进行回收,会进行stw。
cms 老年代使用的回收垃圾器,分成好几个阶段,初始标记,并发标记,并发清理,等等,一般老年代垃圾回收是比较慢的,如果进行stw,此时不会处理用户的请求。

执行一个比较慢的垃圾回收,还要stop the world,需要100ms,此时就会让系统停顿100ms,不能处理任何请求,需要尽可能的让垃圾回收和工作线程同时运行,并发着来执行,所以老年代使用cms。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页