一起吃面筋 001

快春招了,小豪说吃面筋能够强身健体,因此烤了一些面筋和大家一起分享。凡事就怕认真,每天吃一点,让时间给你答案。

1.谈谈你对JVM的了解?

回答思路:JVM是什么?它有什么作用?

参考回答:JVM是Java虚拟机,是实现Java代码平台无关性的关键所在。Java源代码通过编译器生成字节码文件,JVM加载字节码文件,将其转化为能够在特定平台上运行的机器码。

2.什么是JVM内存区域?

回答思路:在脑海中回忆运行时数据区的示意图,简单说下每块区域的特点、作用。
参考回答
运行时数据区先说下线程私有区,这里就是简单说各区域作用,记得啥说啥,不用说的很细。

虚拟机栈:栈也叫栈内存,主管Java程序的运行,是在线程创建时创建,生命周期跟随线程的生命期,8种基本类型的变量+对象的引用变量+实例方法都是在栈内存中分配。每个方法执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常,相当于你调用的栈指针指向为空了。大多数虚拟机栈可以动态扩展,如果因为内存原因导致虚拟机栈申请扩大内存没得到允许,就会出现OutOfMemoryError异常。

本地方法栈: 作用类似于虚拟机栈,只不过作用对象是本地方法,而不是Java方法。与虚拟机栈一样,本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。

程序计数器:当前线程所执行的字节码的行号指示器,控制程序执行顺序。此内存区域不用考虑OutOfMemoryError情况。

线程共享区包括堆和方法区

:此内存唯一目的就是存放对象实例,在虚拟机启动时就创建,属于线程共有区,是各种垃圾收集器和垃圾回收算法的主要战场。如果在堆中没有内存完成对象实例分配,并且堆也无法扩展,就会抛出OOM异常。

方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。其中常量池用于存放编译期生成的各种字面量和符号引用。当方法区无法满足内存分配需求时,也会抛出OOM异常。

直接内存:直接内存不属于虚拟机运行时数据区的一部分,但这部分内存也被频繁使用,会导致OutOfMemoryError异常出现,因为虽然本地直接内存的分配不受Java堆大小限制,但是却会受到本机总内存大小以及处理器寻址空间限制。

3.垃圾收集算法有哪些?

回答思路:说清楚四种垃圾收集算法的思路是什么?特点?适用场景?

参考回答
标记清除算法:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。效率问题,产生内存碎片问题。

复制算法:为了解决效率问题,“复制”收集算法出现了。它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。有效内存空间只有一半问题。

标记整理算法:标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。移动对象效率问题。

分代收集算法:当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将 java 堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。

比如在新生代中,每次收集都会有大量对象死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。

4.你了解哪些垃圾收集器?

回答思路:重点说清楚CMS垃圾收集器和G1垃圾收集器,各自回收过程?特点?优缺点?

参考回答
CMS: Concurrent Mark Sweep 垃圾收集器是以获取最短回收停顿时间为目标的收集器,并发进行垃圾回收(垃圾回收线程和用户线程基本可以看作一起进行),采用标记清除算法,整个过程包括初始标记、并发标记、重新标记、并发清除。

优点:并发收集,停顿时间短; 缺点:对CPU资源敏感,无法处理浮动垃圾,产生内存碎片。

G1:G1 (Garbage-First) 是一款面向服务器的垃圾收集器,满足GC停顿时间要求的同时还具备高吞吐量性能。回收过程包括初始标记、并发标记、筛选标记、筛选回收。

优点:并行并发、分代收集、空间整理、预测停顿;G1 收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的 Region(这也就是它的名字 Garbage-First 的由来)。这种使用 Region 划分内存空间以及有优先级的区域回收方式,保证了 G1收集器在有限时间内可以尽可能高的收集效率(把内存化整为零)。

5.创建线程的方式有几种?

回答思路:常见的创建线程有四种方式。

参考回答
通过实现Runnable接口来创建线程

通过继承Thread类来创建线程

通过实现Callable接口来创建线程

通过(Executor框架)线程池创建线程

6.怎么保证多线程的运行安全性?

回答思路:有哪些安全性问题?分别怎么解决?

参考回答
缓存导致的可见性问题、线程切换导致的原子性问题、编译优化导致的有序性问题。
juc并发工具包里面的Atomic原子类、Lock、Synchronized可以解决原子性问题。
Synchronized、Lock、volatile可以解决可见性问题。
Happens-Before 规则可以解决有序性问题。

7.关于多线程锁的升级原理?

回答思路:锁的级别有哪些?锁升级的目的?升级过程和底层原理?

参考回答
锁的级别从低到高:无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁

升级过程和原理:在锁对象的对象头里有一个threadid字段,在第一次访问的时候threadid为空,jvm让其持有偏向锁,并将threadid设置为其线程id,再次进入的时候会先判断threadid是否与其线程id一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,其它线程通过自旋循环一定次数来获取锁,执行一定次数之后,其它线程如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了synchronized锁的升级。

升级目的:锁升级是为了减低锁带来的性能消耗。

8.HTTPS原理,以及安全的概念是怎样理解的?

回答思路:重点放在HTTPS的加密通信原理的回答,最好是能够回答出详细的握手过程。

参考回答
HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS 运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。
流程示意图

9.MySQL数据库的事务以及事务的特性?

回答思路:事务的概念以及ACID特性。

参考回答
事务就是一个程序执行单元,里面的操作要么都做,要么都不做。事务有四个非常重要的特性(ACID):

原子性(Atomicity):事务是不可分割的整体,所有操作要么全做,要么全不做;只要事务中有一个操作出错,回滚到事务开始前状态,即之前已执行的操作无效。

一致性(Consistency):事务执行前后,从一个一致性状态到另一个一致性状态;比如A向B转账(A、B总金额就是一个一致性状态),不可能出现A扣了钱。B却没收到。

隔离性(Isolation):多个并发事务之间相互隔离, 不能相互干扰。

持久性(Durablity):事务完成后,对数据库的更改是永久保存的,不能回滚。

10.MySQL的隔离级别?

回答思路:理解脏读、不可重复读、幻读的概念,四种隔离级别分别能解决什么问题?
参考回答

隔离级别 有四种,分别是:读未提交、读已提交、可重复读、序列化。
  读未提交: Read Uncommitted,顾名思义,就是一个事务可以读取另一个未提交事务的数据。最低级别,它存在4个常见问题(脏读、不可重复读、幻读、丢失更新)。
  读已提交: Read Committed,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。 它解决了脏读问题,存在3个常见问题(不可重复读、幻读、丢失更新)。
  可重复读: Repeatable Read,就是在开始读取数据(事务开启)时,不再允许修改操作 。它解决了脏读和不可重复读,还存在2个常见问题(幻读、丢失更新)。
  序列化: Serializable,序列化,或串行化。就是将每个事务按一定的顺序去执行,它将隔离问题全部解决,但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

11.谈谈你对SpringBoot的了解?

回答思路:是SpringBoot是什么?优点?难点?
参考回答
Spring Boot 并不是一个框架,本质上其实就是一个基于Spring框架的应用。
优点:约定优于配置、自动装配、内嵌服务器、yml配置支持、支持多种插件。
缺点:集成度较高,使用过程中不太容易了解底层。

12.SpringBoot是如何工作的?

回答思路:SpringBoot的启动流程,紧接着肯定会问你源码实现了。所以需要理解注解@SpringBootApplication和启动类run()方法的底层原理,准备后续深挖的问题。
参考回答
Springboot启动过程

更多

对我的文章感兴趣,点个关注是对我最大的支持,持续更新中…
关注微信公众号LearnJava:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值