阿里Java研发岗二面:java开源oa系统

前言

大家在面试的时候不同程度会被问到JVM的垃圾回收,看面试官水平,有些就背个书就行,比如GC的工作原理,有哪些GC算法和回收器,分别优点和缺点等等,有些面试官估计自己也就背书水平,都没个追问;有些面试官就能追问,一追问就歇菜,比如低延迟的垃圾回收器有哪些以及其原理,跨代引用及解决方案,三色标记及漏标问题处理,等等。

还是那句话,虽然都是些理论的问题,但是在实际开发过程中真的能遇到这些问题来解决实际问题,所以多多了解JVM的实现原理总没有错,既能抗极限面试,又能在适时的时候帮忙解决实际问题,得到领导和同事的赞赏,何乐不为?

下面进入正题,先来个开胃菜,热热身。GC的工作原理就不说了,要准备面试的同学必须倒背如流,不然面试官要说出门右转了…

为什么要用多线程

任何一项技术的出现都是为了解决现有问题。

之前的互联网大多是单机服务,体量小;而现在的更多是集群服务,同一时刻有多个用户同时访问服务器,那么会有很多线程并发访问。

比如在电商系统里,同一时刻比如整点抢购时,大量用户同时访问服务器,所以现在公司里开发的基本都是多线程的。

使用多线程确实提高了运行的效率,但与此同时,我们也需要特别注意数据的增删改情况,这就是线程安全问题,比如之前说过的 HashMap vs HashTableVector vs ArrayList

要保证线程安全也有很多方式,比如说加锁,但又可能会出现其他问题比如死锁,所以多线程相关问题会比较麻烦。

因此,我们需要理解多线程的原理和它可能会产生的问题以及如何解决问题,才能拿下高薪职位。

进程 vs 线程

程序 program

说到进程,就不得不先说说程序。

程序,说白了就是代码,或者说是一系列指令的集合。比如「微信.exe」这就是一个程序,这个文件最终是要拿到 CPU 里面去执行的。

进程 process

当程序运行起来,它就是一个进程

所以程序是“死”的,进程是“活”的

比如在任务管理器里的就是一个个进程,就是“动起来”的应用程序。

Q:这些进程是并行执行的吗?

单核 CPU 一个时间片里只能执行一个进程。但是因为它切换速度很快,所以我们感受不到,就造成了一种多进程的假象。(多核 CPU 那真的就是并行执行的了。)

Q:那如果这个进程没执行完呢?

当进程 A 执行完一个时间片,但是还没执行完时,为了方便下次接着执行,要保存刚刚执行完的这些数据信息,叫做「保存现场」。

然后等下次再抢到了资源执行的时候,先「恢复现场」,再开始继续执行。

这样循环往复。。

这样反复的保存啊、恢复啊,都是额外的开销,也会让程序执行变慢。

Q:有没有更高效的方式呢?

如果两个线程归属同一个进程,就不需要保存、恢复现场了。

这就是 NIO 模型的思路,也是 NIO 模型比 BIO 模型效率高很多的原因,我们之后再讲。

线程 thread

线程,是一个进程里的具体的执行路径,就是真正干活的。

在一个进程里,一个时间片也只能有一个线程在执行,但因为时间片的切换速度非常快,所以看起来就好像是同时进行的。

一个进程里至少有一个线程。比如主线程,就是我们平时写的 main() 函数,是用户线程;还有 gc 线程是 JVM 生产的,负责垃圾回收,是守护线程

每个线程有自己的 stack,记录该线程里面的方法相互调用的关系;

但是一个进程里的所有线程是共用堆 heap 的。

那么不同的进程之间是不可以互相访问内存的,每个进程有自己的内存空间 memeory space,也就是虚拟内存 virtual memory

通过这个虚拟内存,每一个进程都感觉自己拥有了整个内存空间。

虚拟内存的机制,就是屏蔽了物理内存的限制。

Q:那如果物理内存被用完了呢?

用硬盘,比如 windows 系统的分页文件,就是把一部分虚拟内存放到了硬盘上。

相应的,此时程序运行会很慢,因为硬盘的读写速度比内存慢很多,是我们可以感受到的慢,这就是为什么开多了程序电脑就会变卡的原因。

Q:那这个虚拟内存是有多大呢?

对于 64 位操作系统来说,每个程序可以用 64 个二进制位,也就是 2^64 这么大的空间!

如果还不清楚二进制相关内容的,公众号内回复「二进制」获取相应的文章哦~

总结

总结一下,在一个时间片里,一个 CPU 只能执行一个进程。

CPU 给某个进程分配资源后,这个进程开始运行;进程里的线程去抢占资源,一个时间片就只有一个线程能执行,谁先抢到就是谁的。

多进程 vs 多线程

每个进程是独立的,进程 A 出问题不会影响到进程 B;

虽然线程也是独立运行的,但是一个进程里的线程是共用同一个堆,如果某个线程 out of memory,那么这个进程里所有的线程都完了。

所以多进程能够提高系统的容错性 fault tolerance ,而多线程最大的好处就是线程间的通信非常方便。

进程之间的通信需要借助额外的机制,比如进程间通讯 interprocess communication - IPC,或者网络传递等等。

结局:总结+分享

看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了Java互联网工程师面试1000题,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱,所以福利也为你准备,这份1000题免费送你!点击这里免费领取

  • Java互联网工程师面试1000题

image.png

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的 《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。

  • 程序员代码面试指南–IT名企算法与数据结构题目最优解

image.png

  • 其余像设计模式,建议可以看看下面这4份PDF(已经整理)

image.png

  • 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

image.png

xLzY-1622523795008)]

  • 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

[外链图片转存中…(img-3rxX0rY0-1622523795009)]

以上所提及的全部Java面试学习的PDF及笔记,如若皆是你所需要的,那么都可发送给你!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值