2019百度与阿里秋招面经总结3(后续)

14. 了解jdk12的新特性吗,说说G1的新功能吧

可中断的G1
如果G1混合集合可能超过暂停目标,则使其可以中止。

如果G1发现启发式的收集重复的选择错误的区域数,及收集预测不准确的时候,会切换到更复杂的方式来执行收集:将需收集的内容拆分为两个部分,强制部分和可选部分。强制性部分包括G1不能逐步收集处理的部分(例如年轻代),但也可以包含老年代以提高效率。例如,强制部分可以是预测的收集部分的80%。剩余的20%(仅由老年代组成)构成可选部分。

G1完成强制部分的收集后,如果还有剩余时间,G1会以更细粒度的级别开始收集可选部分。此可选部分的收集粒度取决于剩余的时间量,一次最多只能到一个区域。完成对可选部分的收集后,G1可以根据剩余时间决定停止集合。

随着收集预测再次变得准确,可选部分变得越来越小,直到强制部分再次包含所有待收集部分(即,G1完全依赖于其启发式)。如果预测再次变得不准确,则下一个集合将再次包含强制和可选部分。

通过G1更及时的返回未使用的内存
增强G1垃圾收集器,以便在空闲时自动将Java堆内存返回给操作系统

为了实现向操作系统返回最大内存量的目标,G1将在应用程序不活动期间定期尝试或触发并发周期以确定整体Java堆使用情况。这将导致它自动将Java堆的未使用部分返回给操作系统。同时,用户可主动选择full gc ,从而最大化的返回的未使用内存。

15.说说计算机网络的层次、按照5层来说吧

物理层,数据链路层,网络层,传输层和应用层。
物理层是最低部的一层,主要是用来传输比特,解决网络中的异构问题。
数据链路层在物理层之上,他的作用主要是把数据封装成帧,实现简单的数据校验功能。
网络层中的主要协议是ip协议,主要是通过ip协议在网络中去寻找ip地址对应的主机。
传输层两大协议是TCP协议和UDP协议,提供了可靠传输和巨量传输两种模式给上层,上层可以通过传输层中的协议进行端到端的数据传输。
应用层是最上面一层,主要是为了适配各式各样应用的网络模块设计,比如浏览器使用http协议和80端口,但其他应用的协议又不同,应用层就是为了不同应用而存在的。

16.Spring Boot与Spring的区别是什么

Spring Boot可以建立独立的Spring应用程序;
内嵌了如Tomcat,Jetty和Undertow这样的容器,也就是说可以直接跑起来,用不着再做部署工作了。
无需再像Spring那样搞一堆繁琐的xml文件的配置;
可以自动配置Spring;
提供了一些现有的功能,如量度工具,表单数据验证以及一些外部配置这样的一些第三方功能;
提供的POM可以简化Maven的配置;

Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等。
但他们的基础都是Spring 的 ioc和 aop ioc 提供了依赖注入的容器 aop ,解决了面向横切面的编程,然后在此两者的基础上实现了其他延伸产品的高级功能。Spring MVC是基于 Servlet 的一个 MVC 框架 主要解决 WEB 开发的问题,因为 Spring 的配置非常复杂,各种XML、 JavaConfig、hin处理起来比较繁琐。于是为了简化开发者的使用,从而创造性地推出了Spring boot,约定优于配置,简化了spring的配置流程。

说得更简便一些:Spring 最初利用“工厂模式”(DI)和“代理模式”(AOP)解耦应用组件。大家觉得挺好用,于是按照这种模式搞了一个 MVC框架(一些用Spring 解耦的组件),用开发 web 应用( SpringMVC )。然后有发现每次开发都写很多样板代码,为了简化工作流程,于是开发出了一些“懒人整合包”(starter),这套就是 Spring Boot。

17.说下Spring AOP中的动态代理吧

①JDK动态代理只提供接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例, 生成目标类的代理对象。

②如果代理类没有实现 InvocationHandler 接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

18.知道Spring 框架的事物传播行为吗?

主要有七个,
(1)propagation_required:传播行为,这是默认的事物传播机制。上下文存在事务则将事务加入到事务中执行,否则新建事务然后在执行。
(2)propagation_support:支持行为,它表示上下文如果存在事务那么就支持事务加入事务,否则就以非事务的方式进行执行。
(3)propagation_mandatory:强制行为,他表示上下文必须存在事务否则就抛出异常!
(4)propagation_not_support:不支持行为,他表示如果上下文存在事务那就将事务直接挂起,等当前逻辑执行完才恢复上下文事务。
(5)propagation_requires_new:它表示每次都要新建一个新的事务,并且将上下文事务挂起,等待事务执行完之后再将上下文事务恢复执行。
(6)propagation_never:他表示上下文绝不能存在事务,否则就抛出runtime异常。
(7)propagation_nested:嵌入行为,它表示如果存在上下文事务,那就嵌入到上下文事务中执行,如果不存在事务那就会新建事务。

19.如果服务器卡住了,不能dump数据怎么办

通过ps命令查询进程,看一下哪个进程有异常,如果是数据库进程的问题,那可能就是发生了死锁或者大量线程查询拥塞了。如果是java进程卡住了可能就是发生了逻辑错误或者大量请求使服务器宕机了。

20.如果客户端禁止 cookie, 能实现 session 还能用吗?

因为禁用Cookie就不能得到Session,但是可以通过其他方式使用session
Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。假定用户关闭Cookie的情况下使用Session,其实现途径有以下几种:1.手动通过URL传值、隐藏表单传递Session ID。2.用文件、数据库等形式保存Session ID,在跨页过程中手动调用。

21.在你的项目中你什么进行异常处理的

我的项目主要技术点就是使用的Spring,在SpringMVC中的流程链中会捕捉未处理Runtime异常并进行事务回滚。我利用了SpringMVC这一特性,先自己DIY了几个不同的异常类,这些异常类都继承自Runtime异常,保证了SpringMVC能够捕捉到他们。
主要有用户操作异常,系统操作异常和参数校验异常,用户操作异常就是业务方面的异常,系统操作异常就是IO操作这些异常,参数校验异常是我对用户上传的参数都会进行校验,校验不通过时抛出异常。然后在SpringMVC中使用一个全局异常处理分别捕捉不同的异常并进行处理,处理的原则就是返回给用户友好的信息,打印异常日志以做记录,严重时给维护人员报警。
这样做的好处就是可以统一去处理异常,还能利用Spring捕获异常时发生的事务回滚,保证数据完整性。

22.你的项目什么场景中会用到多线程?描述一下

使用线程池的地方就会用到多线程
定时任务,如定时清除用户产生的临时数据,用户身份校验,
登录信息监测、垃圾清理、邮件分发、信息更新…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Tronhon

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

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

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

打赏作者

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

抵扣说明:

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

余额充值