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也会做一些沟通

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/111410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(H5轮播)vue一个轮播里显示多个内容/一屏展示两个半内容

效果图 : html: <div class"content"><van-swipeclass"my-swipe com-long-swipe-indicator":autoplay"2500"indicator-color"#00C4FF"><van-swipe-itemclass"flex-row-wrap"v-for"(items, index) in M…

【Git】升级MacOS系统,git命令无法使用

终端执行git命令报错 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun安装这个东东&#xff0c;&#xff1f;需要42小时 最终解决&#xff1a; 下载安装 https…

【WPF】对Image元素进行缩放平移等操作

元素布局 <Border Grid.Row"1" Name"border" ClipToBounds"True" Margin"10,10,10,10"><Image Name"image" Visibility"Visible" Margin"3,3,3,3" Grid.Column"1" Source"{Bin…

微信小程序开发的OA会议之会议个人中心的页面搭建及模板,自定义组件的学习

目录 一.自定义组件及会议效果编写 效果显示 二.个人中心布局 编写结果 ​编辑 一.自定义组件及会议效果编写 在页面中创建一个以components命名的项目来存放组件 再在components文件夹中创建一个组件&#xff0c;名为 :tabs &#xff0c;创建操作如图所示 刚刚创建好会报…

山海鲸可视化B/S架构应用

一、什么是B/S架构 BS架构&#xff08;Browser-Server架构&#xff09;是一种常见的软件架构模式&#xff0c;其中系统的核心业务逻辑和数据处理都发生在服务器端&#xff08;Server&#xff09;&#xff0c;而客户端&#xff08;Browser&#xff09;主要负责显示和用户交互。…

使用GH(命令行)在本地提出Github上的issue、PR,合并PR

使用GH&#xff08;命令行&#xff09;在本地提出Github上的issue、PR&#xff0c;合并PR 前言 Github上的一些操作使用Git命令是无法完成的&#xff0c;因此正常流程就是在网页端进行。等一下&#xff0c;你让程序员用网页进行&#xff1f;果然&#xff0c;有命令行工具可以…

客户端post请求,服务器收到{}数据解决方法

当我们发起登录请求时&#xff0c;后台接收到的为{}数据 原因&#xff1a;传送过去的对象格式不对 解决方案&#xff1a; 引入qs npm install qs 在data中格式化数据 const res await axios({url:http://127.0.0.1:3000/post,method:post,data:Qs.stringify({username:te…

R语言时间序列分析

目录 概述 1、什么是时间序列分析 2、时间序列分析的应用 时间序列的基本操作

手机启用adb无线调试

具体步骤 手机和电脑处于同一个路由器下。 比如手机IP是192.168.31.181&#xff0c;电脑能ping通。 手机端启用无线adb调试先把手机用USB线连接电脑&#xff0c;打开adb&#xff0c;输入以下命令&#xff1a; G:\> adb tcpip 5555 restarting in TCP mode port: 5555 无…

阿里云服务器x86计算架构ECS规格大全

阿里云企业级服务器基于X86架构的实例规格&#xff0c;每一个vCPU都对应一个处理器核心的超线程&#xff0c;基于ARM架构的实例规格&#xff0c;每一个vCPU都对应一个处理器的物理核心&#xff0c;具有性能稳定且资源独享的特点。阿里云服务器网aliyunfuwuqi.com分享阿里云企业…

【高等数学】导数与微分

文章目录 1、导数的概念1.1、引例1.1.1、变速直线运动瞬时速度1.1.2、曲线的切线 1.2、导数的定义1.3、证明常用导数1.4、导数的几何意义1.5、可导与连续的关系 2、函数的求导法则2.1、函数的和、差、积、商的求导法则2.2、反函数的求导法则2.3、复合函数的求导法则2.4、基本初…

github: kex_exchange_identification: Connection closed by remote host

问题描述 (base) ➜ test git:(dev) git pull kex_exchange_identification: Connection closed by remote host Connection closed by 192.30.255.113 port 22 致命错误&#xff1a;无法读取远程仓库。解决方案 参照下边文档 https://docs.github.com/en/authentication/tr…

基于SSM的工资管理系统

基于SSM的工资管理系统 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 管理员界面 通知公告 考勤管理 工资管理 请假管理 摘要 基于SSM&#xff08;Spring、S…

【每日一题】根据规则将箱子分类

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;分类讨论 其他语言cpython3 写在最后 Tag 【分类讨论】【2023-10-20】 题目来源 2525. 根据规则将箱子分类 题目解读 题目意思明确&#xff0c;根据条件判断箱子的类别。 解题思路 方法一&#xff1a;分类讨论 根据…

【小白专用】安装Apache2.4+ 安装PHP8.2+ php与sql server 2008 r2连接测试教程

PHP安装 1、PHP下载 PHP For Windows: Binaries and sources Releases 注意&#xff1a; 1.要下载Thread Safe&#xff0c;否则没有php7apache2_4.dll这个文件 2.如果是64位系统要下载x64的&#xff0c;x86的不行 3.下载Zip 2、PHP解压安装 将Zip进行解压&#xff0c;里…

JavaScript ES6类的定义与继承

文章目录 一、class方式定义类1.认识class定义类2.类和构造函数的异同3.类的构造函数4.类的实例方法5.类的访问器方法6.类的静态方法 二、继承1.extends实现继承2.super关键字3.继承内置类4.类的混入mixin 三、ES6转ES51.class转换2.extends转换 四、多态 一、class方式定义类 …

docker全家桶(基本命令、dockerhub、docker-compose)

概念 应用场景&#xff1a; Web 应用的自动化打包和发布。自动化测试和持续集成、发布。在服务型环境中部署和调整数据库或其他的后台应用。从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。 作用&#xff1a;Docker 使您能够将应用程序与基…

2023年信息院学生科协第二次硬件培训

2023年信息院学生科协第二次硬件培训 前言一、51单片机简介1、什么是单片机2、主流单片机及其编程语言3、单片机的应用4、单片机开发软件 二、GPIO&#xff08;点亮LED&#xff09;1、GPIO简介2、LED简介3、硬件设计4、软件设计 三、GPIO&#xff08;独立按键&#xff09;1、按…

2023.10(u盘刻录iso)主机,vmware,virtualbox安装linux/ubuntu/kali/centos stream9/arch

download 1 kali官网 2 ubuntu官网 3vmware workstation pro(最新版17pro) 4 virtualbox for linux sudo apt install virtualbox-ext-pack 5 win32 disk imger linux dd 刻录iso到u盘 #查看U盘路径 fdisk -l #图形界面 以kali为例会在桌面出现挂载图标 点开之后输入pwd寻…

CVPR 2018 基于累积注意力的视觉定位 Visual Grounding via Accumulated Attention 详解

Abstract&#xff1a; VG面临的主要挑战有3个&#xff1a;1 )查询的主要焦点是什么&#xff1b;2 )如何理解图像&#xff1b;3 )如何定位物体。 在本文中&#xff0c;我们将这些挑战形式化为三个注意力问题&#xff0c;并提出了一个累积注意力( A-ATT )机制来共同推理其中的挑战…