当前位置: 首页 > news >正文

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密集型需求设计线程池的一些建议:

  1. 线程数设置

    • 可以考虑将线程数设置得相对较大,常见的策略是CPU核数 * 2 或者更高。
    • 可以考虑根据系统的实际IO等待时间和CPU时间的比例来动态调整线程数。
  2. 选择合适的队列

    • 使用一个有界队列,例如ArrayBlockingQueue,可以防止任务过多积压,导致内存溢出。
    • 根据实际的业务负载,合理选择队列大小。队列太大可能会消耗更多的内存,太小则可能导致过多的任务被拒绝。
  3. 线程的存活时间

    • 对于IO密集型的任务,线程的存活时间可以设置得相对较短,这样可以更快地释放不再需要的线程资源。
  4. 拒绝策略

    • 当队列满且线程数达到最大值时,需要一个策略来处理新进来的任务。默认的策略是抛出RejectedExecutionException,但也可以选择其他策略,例如调用者运行策略,让提交任务的线程自己去执行这个任务。
  5. 使用任务优先级

    • 如果有些IO任务比其他任务更为紧急,可以考虑使用优先级队列。
  6. 监控与调优

    • 监控线程池的关键指标,如:队列长度、线程数、CPU使用率等。这些信息可以用来判断是否需要调整线程池的配置。
    • 根据业务高峰期调整线程池的配置,例如,夜间IO需求较低时,可以减少线程数。

总之,对于IO密集型的需求,主要的目标是最大化系统的吞吐量。这通常意味着需要使用较多的线程,并合理配置线程池的各项参数。

3.7 你觉得线程池的线程是在什么时机被创建进去的

答:核心线程可以在线程池被声明出来时就被创建,这样的话相当于是线程预热的作用,任务一来了就能用,这是通过preStart参数控制的

3.8 你觉得一个线程的状态有哪些呢

答:运行、就绪、阻塞、终止

Java中,一个线程的生命周期包括多个状态。下面是Java线程的主要状态:

  1. 新建(NEW)

    • 当我们创建一个线程对象,但还没有调用它的 start() 方法时,线程处于此状态。
  2. 可运行(RUNNABLE)

    • 线程对象已经调用了 start() 方法,但线程调度器还未选择它作为当前执行的线程时,它处于可运行状态。这也包括了线程正在Java虚拟机内部运行的状态。
  3. 阻塞(BLOCKED)

    • 线程正在等待监视器锁(比如,当一个线程调用了一个同步方法或同步块并且当前同步方法或同步块已被另一个线程所持有,那么这个线程进入BLOCKED状态)。
  4. 等待(WAITING)

    • 线程因调用了以下方法之一而处于等待状态:
      • Object.wait()
      • Thread.join()
      • LockSupport.park()
    • 这是一个不限时的等待,线程需要被其他线程显式地唤醒。
  5. 超时等待(TIMED_WAITING)

    • 线程调用以下方法之一并指定了超时参数,那么线程会处于这个状态:
      • Thread.sleep(long millis)
      • Object.wait(long timeout)
      • Thread.join(long millis)
      • LockSupport.parkNanos()LockSupport.parkUntil()
    • 在超时时间达到或其他线程唤醒它之前,线程会一直处于此状态。
  6. 终止(TERMINATED)

    • 当线程的 run() 方法完成或线程被中断时,线程处于此状态。

在Java编程中,你可以使用 Thread.getState() 方法来获取一个线程的当前状态。这对于调试和线程管理是非常有用的。

3.9 如果发现cpu的使用率非常高,你会重点关注什么状态的线程呢?

答:如果说线程是阻塞态,它应该不怎么占用cpu,被挂起到了阻塞队列中,所以应该重点关注运行态的线程

3.10 如果我发现某一个应用的线程数一直在持续缓慢的增长,然后这个时候访问量也没有太大的波动,而且你的cpu和负载也没有太大的波动,你会怎么分析,通过什么样的方式分析呢,你会关注什么状态的线程?(我答的不对)

答:

答:当一个应用的线程数持续缓慢增长,但访问量、CPU和负载都相对稳定时,可能的情况有:

  • 线程泄露有些线程可能没有被正确关闭,导致随着时间的推移,线程数量逐渐增加。这在使用自定义线程或线程池时可能会发生。

  • 第三方库/组件:可能使用的某个库或组件在内部创建了线程,并且没有正确地管理它们。

为了进一步分析:

  1. 线程堆栈分析:可以使用Java的内置工具 jstack 来查看应用的线程堆栈。这将为每个线程提供一个快照,显示线程在做什么。通过这个工具,可以识别出不断增长的线程是做什么的,是由哪部分代码启动的。

  2. 关注状态:尤其是 WAITINGTIMED_WAITING 的线程。虽然这些线程可能不会消耗大量的CPU,但它们可能是因为等待某个资源或某个条件而被阻塞,导致线程数增长。

  3. 监视工具:使用如VisualVM, JProfiler等工具可以实时监控线程的创建、状态和销毁。这可以帮助识别线程创建的模式和可能的线程泄露。

  4. 日志审查:查看应用的日志,检查是否有异常、错误或其他相关信息,这可能与线程的行为有关。

  5. 代码审查:检查代码中所有创建线程或线程池的地方,确保线程在完成其任务后被正确关闭。

结论:当线程数持续增长但其他指标相对稳定时,很可能是线程管理问题或线程泄露。关键是找到哪些线程不断被创建并为什么它们没有被正确地关闭。

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 说说你在实习期间遇到的挑战、收获 &#xff08;1&#xff09;在设计模式的应用能力上&#xff0c;有了很大的提高&#xff0c;使用模板设计模式&#xff0c;架构实例反向同步到架构定义&#xff0c;使用了策略模式 &#xff08;2&#xff09; …...

Qt扫盲-QBrush理论使用总结

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

互联网Java工程师面试题·Java 面试篇·第三弹

目录 39、JRE、JDK、JVM 及 JIT 之间有什么不同&#xff1f; 40、解释 Java 堆空间及 GC&#xff1f; 41、你能保证 GC 执行吗&#xff1f; 42、怎么获取 Java 程序使用的内存&#xff1f;堆使用的百分比&#xff1f; 43、Java 中堆和栈有什么区别&#xff1f; 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数据可视化工具&#xff0c;以及一套专为用友U8打造的标准化BI数据分析方案。 奥威BI SaaS平台&#xff1a;一键链接用友U8&#xff0c;立得报表 别的BI软件围绕用友U8的数据做可视化&#xff1a;1、准备配置环境&#xff1b;2、下载安装配…...

DOS常用指令

一、dir显示目录 dir命令是Windows系统常用的命令&#xff0c;用于显示目录的文件和子目录的列表。如果不使用参数&#xff0c;此命令将显示磁盘的卷标和序列号&#xff0c;然后是磁盘上的目录和文件列表&#xff08;包括它们的名称以及每个文件最后修改的日期和时间&#xff…...

【Pycharm中python调用另一个文件类或者函数】

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

pycharm操作git、前后端项目上传到gitee

pycharm操作git 之前用命令做的所有操作&#xff0c;使用pychrm点点就可以完成 克隆代码 上方工具栏Git ⇢ \dashrightarrow ⇢ Clone ⇢ \dashrightarrow ⇢ 填写地址&#xff08;http、ssh&#xff09; 提交到暂存区&#xff0c;提交到版本库&#xff0c;推送到远程 直接…...

jmeter监听每秒点击数(Hits per Second)

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

RabbitMQ 消息模型

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

STM32cubemx对FreeRTOS的适配(工程模板配置)

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

SpringSecurity+ Oauth2.0+JWT 0-1

这里写目录标题 准备工作准备SQL添加用户添加依赖准备UserInfoUserMapperUserServiceUserServiceImpl配置SpringDataUserDetailsService 授权服务器&#xff1a;AuthorizationServer配置客户端详细信息管理令牌定义TokenConfig定义AuthorizationServerTokenServices 令牌访问端…...

Echart图表收起/展开后无法重新渲染实现自适应(亲测有效)-开发bug总结5

问题描述&#xff1a; 后台管理系统&#xff0c;左侧的菜单栏是可以展开/收起的&#xff0c;默认是展开&#xff0c;此时页面上的图表加载正常&#xff0c;如果收起后再展开&#xff0c;页面底部就会出现滚动轴&#xff0c;图表没有重新绘制。 网上也查了很多方法。基本都是通…...

互联网Java工程师面试题·Java 面试篇·第二弹

目录 15、什么是不可变对象&#xff08;immutable object&#xff09;&#xff1f;Java 中怎么创建一个不可变对象&#xff1f; 16、我们能创建一个包含可变对象的不可变对象吗&#xff1f; 17、Java 中应该使用什么数据类型来代表价格&#xff1f; 18、怎么将 byte 转换为 Str…...

【ARM裸机】ARM入门

1.ARM成长史 2.ARM的商业模式和生态系统 ARM只设计CPU&#xff0c;但是不生产CPU 3.为什么使用三星&#xff1a;S5PV210 4.各种版本号 0. ARM和Cortex Cortex就是ARM公司一个系列处理器的名称。比如英特尔旗下处理器有酷睿&#xff0c;奔腾&#xff0c;赛扬。ARM在最初的处理器…...

webGL编程指南 第三章 矩阵旋转三角形rotatedTriangle_Matrix

我会持续更新关于wegl的编程指南中的代码。 当前的代码不会使用书中的缩写&#xff0c;每一步都是会展开写。希望能给后来学习的一些帮助 git代码地址 &#xff1a;git 接着 上一节中 接着做平移的转化。在本次的案例案例中主要是xy的坐标变量相加&#xff0c;同时传递个给相…...

【常用的Git命令】

Git是一个版本控制系统&#xff0c;它拥有众多的命令。以下是一些常用的Git命令&#xff1a; 配置相关命令: git config --global user.name "Your Name"&#xff1a;设置用户姓名git config --global user.email "youremailexample.com"&#xff1a;设置用…...

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…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

Android屏幕刷新率与FPS(Frames Per Second) 120hz

Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数&#xff0c;单位是赫兹&#xff08;Hz&#xff09;。 60Hz 屏幕&#xff1a;每秒刷新 60 次&#xff0c;每次刷新间隔约 16.67ms 90Hz 屏幕&#xff1a;每秒刷新 90 次&#xff0c;…...

linux设备重启后时间与网络时间不同步怎么解决?

linux设备重启后时间与网络时间不同步怎么解决&#xff1f; 设备只要一重启&#xff0c;时间又错了/偏了&#xff0c;明明刚刚对时还是对的&#xff01; 这在物联网、嵌入式开发环境特别常见&#xff0c;尤其是开发板、树莓派、rk3588 这类设备。 解决方法&#xff1a; 加硬件…...

GitHub 常见高频问题与解决方案(实用手册)

1.Push 提示权限错误&#xff08;Permission denied&#xff09; 问题&#xff1a; Bash Permission denied (publickey) fatal: Could not read from remote repository. 原因&#xff1a; 没有配置 SSH key 或使用了 HTTPS 而没有权限…...