2023-9-12 阿里健康2024秋招后端开发-体检及泛医疗二面
1 自我介绍
2 快手实习
2.1 说说你在实习期间遇到的挑战、收获
(1)在设计模式的应用能力上,有了很大的提高,使用模板设计模式,架构实例反向同步到架构定义,使用了策略模式
(2)
2.2 讲讲反向同步的背景,为什么要这么做呢
答:
2.3 讲讲你遇到的比较有挑战性的问题,讲讲过程中你怎么思考这个问题的
答:权威接线和初始的接线的状态的比较判断,刚开始一下子把所有的数据中心的数据都拉到本地内存中,发现有OOM问题,后面逐个同步单个数据中心的数据,同步的粒度缩小了,这样的话就能够同步完成了。
2.4 你们OOM之后,是怎么进行分析定位问题的
OOM分析之问题定位
答:有日志报错,通过OOM的报错信息(java.lang.OutOfMemoryError: Java heap space),我们知道是堆发生了OOM了,因为我们事先设置了-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path_to_directory参数,配置了发生OOM时的内存快照转储路径,所以从这个指定的路径中查找到相应的OOM文件,再通过MAT工具发现了这里有一个列表特别大,所以我们分析就知道了这个代码问题出在了哪
3 中泓在线实习
3.1 你负责的这个同步服务,是怎么做的呢?
答:jdbc原生接口支持几百张表的同步,避免创建大量的同步表;利用数据表进行隔离,多线程同时进行同步操作,加速同步过程;增量同步,在夜间进行同步操作
3.2 你这个表级别的隔离和利用线程池提升传输效率是怎么实现的呢?
答:
(1)外部csv文件包含了需要需要同步的表的表名,每一行数据包含了表名、源库名、目的库名,服务一启动就会读取csv文件,然后将其放入到map当中
(2)主线程读取这个map中,然后遍历这个map,将这个map中的表名,源库名,目的苦命放入到创建的Runnable对象当中,这个runnable对象负责写具体的表级别的同步逻辑,然后再调用已经创建好的线程池对象的execute方法就可以执行这个任务了,这个任务后续是排队还是直接执行就看自己使用的哪个类型的线程池了。
3.3 你这个自定义线程池是怎么创建的
答:通过ThreadPoolExecutor创建的,给这个里面传入了核心线程数,最大线程数,阻塞队列,保活时间以及自定义线程工厂
3.4 那你线程里的线程和你要处理的数据表之间是一个怎么样的关系
答:一一对象,一个线程处理一张表
3.5 你线程池里面线程的数量和表的数量是什么关系呢?
答:当时想的是核心线程数设置为20,这是根据公式(核心线程数=cpu核数(线程等待时间/线程执行任务的平均时间+1)得来的,最大线程数设置表的数量,然后再使用一个阻塞队列,这里的非核心线程的数量也不敢设置的太大,因为数据同步涉及到大量的数据迁移任务,所以如果同步的过程中同时从mysql中拉取了太多的数据时,可能会造成OOM;
如果待同步的表数据量基本不大,而且后面做的是修改操作,则同步操作使用cachedThreadPool比较好。
3.6 如果是IO密集型的需求,cpu空闲时间会很长,怎么设计线程池比较好?
因为这是一个IO密集型的需求,一个任务的IO时间很长,也就是说在网络IO期间会被阻塞,cpu空闲时间会很长,
对于IO密集型的任务,由于线程在等待IO(例如,磁盘操作或网络请求)时不会消耗CPU,可以使用较多的线程来提高系统的吞吐量。但是,线程本身不是免费的,因为它们需要内存(例如,线程栈)并增加了线程调度的开销。因此,线程数量也不能过多。
以下是针对IO密集型需求设计线程池的一些建议:
-
线程数设置:
- 可以考虑将线程数设置得相对较大,常见的策略是
CPU核数 * 2
或者更高。 - 也可以考虑根据系统的实际IO等待时间和CPU时间的比例来动态调整线程数。
- 可以考虑将线程数设置得相对较大,常见的策略是
-
选择合适的队列:
- 使用一个有界队列,例如
ArrayBlockingQueue
,可以防止任务过多积压,导致内存溢出。 - 根据实际的业务负载,合理选择队列大小。队列太大可能会消耗更多的内存,太小则可能导致过多的任务被拒绝。
- 使用一个有界队列,例如
-
线程的存活时间:
- 对于IO密集型的任务,线程的存活时间可以设置得相对较短,这样可以更快地释放不再需要的线程资源。
-
拒绝策略:
- 当队列满且线程数达到最大值时,需要一个策略来处理新进来的任务。默认的策略是抛出
RejectedExecutionException
,但也可以选择其他策略,例如调用者运行策略,让提交任务的线程自己去执行这个任务。
- 当队列满且线程数达到最大值时,需要一个策略来处理新进来的任务。默认的策略是抛出
-
使用任务优先级:
- 如果有些IO任务比其他任务更为紧急,可以考虑使用优先级队列。
-
监控与调优:
- 监控线程池的关键指标,如:队列长度、线程数、CPU使用率等。这些信息可以用来判断是否需要调整线程池的配置。
- 根据业务高峰期调整线程池的配置,例如,夜间IO需求较低时,可以减少线程数。
总之,对于IO密集型的需求,主要的目标是最大化系统的吞吐量。这通常意味着需要使用较多的线程,并合理配置线程池的各项参数。
3.7 你觉得线程池的线程是在什么时机被创建进去的
答:核心线程可以在线程池被声明出来时就被创建,这样的话相当于是线程预热的作用,任务一来了就能用,这是通过preStart参数控制的
3.8 你觉得一个线程的状态有哪些呢
答:运行、就绪、阻塞、终止
Java中,一个线程的生命周期包括多个状态。下面是Java线程的主要状态:
-
新建(NEW):
- 当我们创建一个线程对象,但还没有调用它的
start()
方法时,线程处于此状态。
- 当我们创建一个线程对象,但还没有调用它的
-
可运行(RUNNABLE):
- 线程对象已经调用了
start()
方法,但线程调度器还未选择它作为当前执行的线程时,它处于可运行状态。这也包括了线程正在Java虚拟机内部运行的状态。
- 线程对象已经调用了
-
阻塞(BLOCKED):
- 线程正在等待监视器锁(比如,当一个线程调用了一个同步方法或同步块并且当前同步方法或同步块已被另一个线程所持有,那么这个线程进入BLOCKED状态)。
-
等待(WAITING):
- 线程因调用了以下方法之一而处于等待状态:
Object.wait()
Thread.join()
LockSupport.park()
- 这是一个不限时的等待,线程需要被其他线程显式地唤醒。
- 线程因调用了以下方法之一而处于等待状态:
-
超时等待(TIMED_WAITING):
- 线程调用以下方法之一并指定了超时参数,那么线程会处于这个状态:
Thread.sleep(long millis)
Object.wait(long timeout)
Thread.join(long millis)
LockSupport.parkNanos()
或LockSupport.parkUntil()
- 在超时时间达到或其他线程唤醒它之前,线程会一直处于此状态。
- 线程调用以下方法之一并指定了超时参数,那么线程会处于这个状态:
-
终止(TERMINATED):
- 当线程的
run()
方法完成或线程被中断时,线程处于此状态。
- 当线程的
在Java编程中,你可以使用 Thread.getState()
方法来获取一个线程的当前状态。这对于调试和线程管理是非常有用的。
3.9 如果发现cpu的使用率非常高,你会重点关注什么状态的线程呢?
答:如果说线程是阻塞态,它应该不怎么占用cpu,被挂起到了阻塞队列中,所以应该重点关注运行态的线程
3.10 如果我发现某一个应用的线程数一直在持续缓慢的增长,然后这个时候访问量也没有太大的波动,而且你的cpu和负载也没有太大的波动,你会怎么分析,通过什么样的方式分析呢,你会关注什么状态的线程?(我答的不对)
答:
答:当一个应用的线程数持续缓慢增长,但访问量、CPU和负载都相对稳定时,可能的情况有:
-
线程泄露:有些线程可能没有被正确关闭,导致随着时间的推移,线程数量逐渐增加。这在使用自定义线程或线程池时可能会发生。
-
第三方库/组件:可能使用的某个库或组件在内部创建了线程,并且没有正确地管理它们。
为了进一步分析:
-
线程堆栈分析:可以使用Java的内置工具
jstack
来查看应用的线程堆栈。这将为每个线程提供一个快照,显示线程在做什么。通过这个工具,可以识别出不断增长的线程是做什么的,是由哪部分代码启动的。 -
关注状态:尤其是 WAITING 和 TIMED_WAITING 的线程。虽然这些线程可能不会消耗大量的CPU,但它们可能是因为等待某个资源或某个条件而被阻塞,导致线程数增长。
-
监视工具:使用如VisualVM, JProfiler等工具可以实时监控线程的创建、状态和销毁。这可以帮助识别线程创建的模式和可能的线程泄露。
-
日志审查:查看应用的日志,检查是否有异常、错误或其他相关信息,这可能与线程的行为有关。
-
代码审查:检查代码中所有创建线程或线程池的地方,确保线程在完成其任务后被正确关闭。
结论:当线程数持续增长但其他指标相对稳定时,很可能是线程管理问题或线程泄露。关键是找到哪些线程不断被创建并为什么它们没有被正确地关闭。
3.11 你是怎么理解火焰图的横向和纵向,能解决我刚刚说的问题嘛
答:横向表示一个线程执行时花费的cpu时间,纵向表示方法的调用栈,因为你刚刚说的是线程不怎么占用cpu,即任务可能执行完了,但是没有被正确释放,所以火焰图是不适用于解决这个问题的
4 数据结构
4.1 一个元素都不相同的一维数组,先单调递减,后单调递增,请找出其中的最小值,要求logn的复杂度
分析:可以参考lc162. 寻找峰值和lc33. 搜索旋转排序数组
int getMin(int[] a){int l=1,r=a.length-2;while(l<=r){int m=(l+r)/2;if(a[m-1]>a[m]&&a[m+1]>a[m])return a[m];if(a[m-1]>a[m]){l=m+1;} else if(a[m+1]>a[m]){r=m-1;}}return a[l];
}
4.2 一个存在部分元素相同的一维数组,先单调递减,后单调递增,请找出其中的最小值,要求logn的复杂度
5 反问
5.1 要求实习多久
答:两个月左右,最好马上过来,双方加深一下了解
5.2 还有一轮嘛
答:还有一轮hr和面试一起跟你聊
5.3 综合测评可以等hr面之后完成嘛
答:hr可能会看
5.4 我进去之后是负责哪一块业务呢
答:一个是消费医疗,主要阵地在淘宝和支付宝里面,另一个是线上线下的购药场景,近期可能有一些医疗大模型的语料的清洗和生产,你实习期间可能会在大模型这一块做,正式的话可能会根据个人意愿
5.5 base在北京嘛
答:北京和杭州都可以
5.6 多久出结果呢
答:你已经过了
5.7 三面还会聊技术嘛
答:对,然后hr也会做一些沟通
相关文章:
2023-9-12 阿里健康2024秋招后端开发-体检及泛医疗二面
1 自我介绍 2 快手实习 2.1 说说你在实习期间遇到的挑战、收获 (1)在设计模式的应用能力上,有了很大的提高,使用模板设计模式,架构实例反向同步到架构定义,使用了策略模式 (2) …...

Qt扫盲-QBrush理论使用总结
Q 理论使用总结 一、概述1. 填充模式2. 笔刷颜色3. 纹理 二、 Qt::GlobalColor 一、概述 QBrush类定义了由 QPainter 绘制的形状的填充模式。画笔有样式、颜色、渐变和纹理。 brush style() 使用Qt::BrushStyle 枚举定义填充模式。默认的笔刷样式是 Qt::NoBrush(取决于你如何…...

互联网Java工程师面试题·Java 面试篇·第三弹
目录 39、JRE、JDK、JVM 及 JIT 之间有什么不同? 40、解释 Java 堆空间及 GC? 41、你能保证 GC 执行吗? 42、怎么获取 Java 程序使用的内存?堆使用的百分比? 43、Java 中堆和栈有什么区别? 44、“ab”…...

如何使用VSCode将iPad Pro转化为功能强大的开发工具?
文章目录 前言1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. iPad通过软件远程vscode6.1 创建TCP隧道 7. ipad远…...

将用友U8的数据可视化需要哪些工具?
将金蝶U8的数据可视化需要一个奥威BI数据可视化工具,以及一套专为用友U8打造的标准化BI数据分析方案。 奥威BI SaaS平台:一键链接用友U8,立得报表 别的BI软件围绕用友U8的数据做可视化:1、准备配置环境;2、下载安装配…...
DOS常用指令
一、dir显示目录 dir命令是Windows系统常用的命令,用于显示目录的文件和子目录的列表。如果不使用参数,此命令将显示磁盘的卷标和序列号,然后是磁盘上的目录和文件列表(包括它们的名称以及每个文件最后修改的日期和时间ÿ…...

【Pycharm中python调用另一个文件类或者函数】
Pycharm中python调用另一个文件类或者函数 本文主要介绍了Pycharm中python调用另一个文件类或者函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 文章目录 Pycha…...

pycharm操作git、前后端项目上传到gitee
pycharm操作git 之前用命令做的所有操作,使用pychrm点点就可以完成 克隆代码 上方工具栏Git ⇢ \dashrightarrow ⇢ Clone ⇢ \dashrightarrow ⇢ 填写地址(http、ssh) 提交到暂存区,提交到版本库,推送到远程 直接…...

jmeter监听每秒点击数(Hits per Second)
jmeter监听每秒点击数(Hits per Second) 下载插件添加监听器执行压测,监听结果 下载插件 点击选项,点击Plugins Manager (has upgrades),点击Available Plugins,搜索5 Additional Graphs安装。 添加监听…...

RabbitMQ 消息模型
参考 【RabbitMQ】RabbitMQ架构模型_rabbitmq结构模型-CSDN博客 之前的学习都只是知道名字,但并没有真正的理解,每次看还是不懂,所以今日理解透 ! RabbitMQ 收发消息过程如下: 首先从消费者开始࿱…...

STM32cubemx对FreeRTOS的适配(工程模板配置)
文章目录 前言一、工程的创建二、什么是CMSIS三、STM32cubemx生成的FreeRTOS工程分析总结 前言 本篇文章将带大家使用STM32cubemx对FreeRTOS进行工程模板的配置。 一、工程的创建 1.开始工程的创建: 2.芯片型号选择: 3.修改时钟为TIM8: …...

SpringSecurity+ Oauth2.0+JWT 0-1
这里写目录标题 准备工作准备SQL添加用户添加依赖准备UserInfoUserMapperUserServiceUserServiceImpl配置SpringDataUserDetailsService 授权服务器:AuthorizationServer配置客户端详细信息管理令牌定义TokenConfig定义AuthorizationServerTokenServices 令牌访问端…...
Echart图表收起/展开后无法重新渲染实现自适应(亲测有效)-开发bug总结5
问题描述: 后台管理系统,左侧的菜单栏是可以展开/收起的,默认是展开,此时页面上的图表加载正常,如果收起后再展开,页面底部就会出现滚动轴,图表没有重新绘制。 网上也查了很多方法。基本都是通…...

互联网Java工程师面试题·Java 面试篇·第二弹
目录 15、什么是不可变对象(immutable object)?Java 中怎么创建一个不可变对象? 16、我们能创建一个包含可变对象的不可变对象吗? 17、Java 中应该使用什么数据类型来代表价格? 18、怎么将 byte 转换为 Str…...

【ARM裸机】ARM入门
1.ARM成长史 2.ARM的商业模式和生态系统 ARM只设计CPU,但是不生产CPU 3.为什么使用三星:S5PV210 4.各种版本号 0. ARM和Cortex Cortex就是ARM公司一个系列处理器的名称。比如英特尔旗下处理器有酷睿,奔腾,赛扬。ARM在最初的处理器…...
webGL编程指南 第三章 矩阵旋转三角形rotatedTriangle_Matrix
我会持续更新关于wegl的编程指南中的代码。 当前的代码不会使用书中的缩写,每一步都是会展开写。希望能给后来学习的一些帮助 git代码地址 :git 接着 上一节中 接着做平移的转化。在本次的案例案例中主要是xy的坐标变量相加,同时传递个给相…...
【常用的Git命令】
Git是一个版本控制系统,它拥有众多的命令。以下是一些常用的Git命令: 配置相关命令: git config --global user.name "Your Name":设置用户姓名git config --global user.email "youremailexample.com":设置用…...
cnn 直线检测笔记
目录 mlsd直线检测: ULSD-ISPRS曲线检测 划线标注工具: 可视化标注代码: mlsd直线检测: mlsd_pytorch...
【Edabit 算法 ★☆☆☆☆☆】 Return Something to Me!
【Edabit 算法 ★☆☆☆☆☆】 Return Something to Me! strings language_fundamentals Instructions Write a function that returns the string "something" joined with a space " " and the given argument a. Examples giveMeSomething(“is bett…...
【Redis】数据结构之dict
目录 dict的基本结构dict的相关操作函数底层通用的之查找插入key-value对应该放入ht表的哪个槽rehash过程 dict的基本结构 typedef struct dict {dictType *type;void *privdata;dictht ht[2];long rehashidx; /* rehashing not in progress if rehashidx -1 */unsigned long…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...