其他分享
首页 > 其他分享> > 互联网公司最新技术面试篇

互联网公司最新技术面试篇

作者:互联网

1.git reset 和revert区别

git revert  是生成一个新的提交来撤销某次提交,此次提交之前的commit都会被保留

git reset  是回到某次提交,提交及之前的commit都会被保留,但是此次之后的修改都会被退回到暂存区

2.在你的项目中java线程池的数量是多少 怎么配置的 原理是什么?

首先要考虑到 CPU 核心数,那么在 Java 中如何获取核心线程数?

可以使用 Runtime.getRuntime().availableProcessor() 方法来获取(可能不准确,作为参考)

在确认了核心数后,再去判断是 CPU 密集型任务还是 IO 密集型任务:

CPU 密集型任务:比如像加解密,压缩、计算等一系列需要大量耗费 CPU 资源的任务,大部分场景下都是纯 CPU 计算。

IO 密集型任务:比如像 MySQL 数据库、文件的读写、网络通信等任务,这类任务不会特别消耗 CPU 资源,但是 IO 操作比较耗时,会占用比较多时间。在知道如何判断任务的类别后,让我们分两个场景进行讨论:

1)CPU密集性任务线程分配原则:理论上线程的数量 = CPU 核数就是最合适的,不过通常把线程的数量设置为CPU 核数 +1,会实现最优的利用率。

2)对应IO密集性任务分配原则:

a:对于 IO 密集型计算场景,最佳的线程数是与程序中 CPU 计算和 IO 操作的耗时比相关的,《Java并发编程实战》的作者 Brain Goetz 推荐的计算方法如下:

     线程数 = CPU 核心数 * (1 + IO 耗时/ CPU 耗时)

b:还有一派的计算方式是《Java虚拟机并发编程》中提出的:

线程数 = CPU 核心数 / (1 - 阻塞系数)

其中计算密集型阻塞系数为 0,IO 密集型阻塞系数接近 1,一般认为在 0.8 ~ 0.9 之间。比如 8 核 CPU,按照公式就是 2 / ( 1 - 0.9 ) = 20 个线程数

标签:耗时,密集型,任务,面试,最新,线程,IO,互联网,CPU
来源: https://blog.csdn.net/mclongyi/article/details/114209039