华宇(大连)二面-20190620

1、我们开始吧,你说说Java虚拟机的内存分配吧

  • 程序计数器

  • 虚拟机栈

  • 本地方法栈

  • 方法区

 其中堆和程序计数器是线程共享的

2、在项目中有木有JVM调优的情况?

有一次我发现服务器发生很大程度的卡顿,然后发现是GC的问题,我查看了gc的信息,调整了堆的大小,然后运行正常了

3、JVM调优参数有哪些?有哪些工具可以使用?

  • -Xms2g:初始化推大小为 2g;

  • -Xmx2g:堆最大内存为 2g;

  • -XX:+PrintGC:开启打印 gc 信息;

  • -XX:+PrintGCDetails:打印 gc 详细信息。

  • jconsole:用于对 JVM 中的内存、线程和类等进行监控;

  • jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等。

4、说一下JVM有哪些垃圾回收算法?

  • 标记-清除算法

  • 标记-整理算法

  • 复制算法

  • 分代算法

 5、怎么判断对象是否被收回?

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

  • 可达性分析:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的。

 6、你所说的GC Roots都进行哪些分析?

  • java虚拟机栈中的对象
  • 方法区中的常量
  • 方法区中的属性
  • JNI栈中的全局对象

 7、你所用的虚拟机是什么?

是目前流行的G1

8、虚拟机的分代是怎么分的?

分代回收器有两个分区:老生代和新生代,新生代默认的空间占比总空间的 1/3,老生代的默认占比是 2/3。

新生代使用的是复制算法,新生代里有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1,它的执行流程如下:

  • 把 Eden + From Survivor 存活的对象放入 To Survivor 区;

  • 清空 Eden 和 From Survivor 分区;

  • From Survivor 和 To Survivor 分区交换,From Survivor 变 To Survivor,To Survivor 变 From Survivor。

每次在 From Survivor 到 To Survivor 移动时都存活的对象,年龄就 +1,当年龄到达 15(默认配置是 15)时,升级为老生代。大对象也会直接进入老生代。

老生代当空间占用到达某个值之后就会触发全局垃圾收回,一般使用标记整理的执行算法。以上这些循环往复就构成了整个分代垃圾回收的整体执行流程。

 9、说说你对CMS的理解?

CMS 是英文 Concurrent Mark-Sweep 的简称,是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动 JVM 的参数加上“-XX:+UseConcMarkSweepGC”来指定使用 CMS 垃圾回收器。

CMS 使用的是标记-清除的算法实现的,所以在 gc 的时候回产生大量的内存碎片,当剩余内存不能满足程序运行要求时,系统将会出现 Concurrent Mode Failure,临时 CMS 会采用 Serial Old 回收器进行垃圾清除,此时的性能将会被降低。

10、CMS在进行可达性分析时需要做什么?发生几次?

会发生“Stop the world”,将JVM暂停,来进行判断对象是否被引用,发生两次,一次在标记的时候,一个在清除的时候(面试官说只会发生一次,在清除的时候)

11、一个对象怎么被清除?

如果可达性分析算法没有被标记,就会被放入清除队列,当进行第二次标记是,就会被执行Finalizer(终结方法),但是JVM并不知道对象时否执行了finalize

12、我们说说你在项目中用到的Spring MVC的注解吧

第一面中提到    一面传送门

13、说一个一个请求在Spring MVC中的执行情况

(1)首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;

(2)DispatcherServlet——>HandlerMapping,处理器映射器将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器)对象;

(3)DispatcherServlet——>HandlerAdapter,处理器适配器将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;

(4)HandlerAdapter——>调用处理器相应功能处理方法,并返回一个ModelAndView对象(包含模型数据、逻辑视图名);

(5)ModelAndView对象(Model部分是业务对象返回的模型数据,View部分为逻辑视图名)——> ViewResolver, 视图解析器将把逻辑视图名解析为具体的View;

(6)View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构;

(7)返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

14、mybatis 中 #{}和 ${}的区别是什么?

  • #{}是预编译处理,${}是字符串替换;

  • Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

  • Mybatis在处理${}时,就是把${}替换成变量的值;

  • 使用#{}可以有效的防止SQL注入,提高系统安全性。

15、你对I/O的了解?

  • BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。

  • NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。

  • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

 16、那你?被一面,面试官直接打断,好了,你来吧,你以后就跟着我干,你有什么想问的吗?

工资多少,住处?

实习不是很高,住处公司提供,上下班有公司的车,每月有食补,公司说明都有,健身房,咖啡馆,茶水间,随便用,风景很好,干3-4个月可以转正

面试官很好,他比我大一轮,我可能是公司里岁数最小的吧

随后主考官让我等HR的电话,我到地铁站就接到了HR电话,体检通知,随后就收到了Offer邮件

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值