面试题总结

本文探讨了Java中线程异常的排查方法,包括使用top、ps命令和jstack工具;分析了HashMap在多线程环境下的问题及解决方案;并介绍了数据库大表不停机加字段、ArrayList的扩容机制、JVM频繁FullGC的原因与处理方法等内容。

1.java中出现了异常的线程需要如何排查?

在线程运行的过程中,出现了某些线程异常处理方法:

  • top命令 可以动态查看进程的ID。然后针对具体的异常java进程,使用top -H -p 进程号,即可动态的查看具体的进程对应所在的每个线程的动态变化情况,利用jstack命令查看相关的线程信息进行排查。
  • ps命令 可以使用ps -aux 来查看具体的每个进程的实际应用占用资源情况。结合awk、sort 可以快速定位。实例:ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head 。

2. hashmap多线程下出现的问题?

1.当多线程同时put值的时候,若发生hash碰撞,可能多个元素都落在链表的头部,从而造成元素覆盖(hashcode相同而eques值不同的元素)

例如:线程A put一个元素a ,线程B put一个元素b,a,b 发生hansh碰撞,本应该在map是链表的形式存在,但是可能线程A和线程B同时put到链表的第一个位置,从而后来者覆盖前者元素造成元素丢失。

2.put 造成链表形成闭环,get的时候出现死循环(jdk8已经解决该问题),该情况是出现在多线线程操作map扩容时会发生。

3.hashmap初始化的容量不为2的n次方会怎样?

容量为2的n次方的优点:

  • 长度是2的n次幂是 取模可以转换成按位与运算 效率更高
  • 扩容的时候 这样的长度设置更高效 扩展也总是2次幂的 这样的话 元素位置要么在原位 要么移动2次幂

如果初始化不为2的n次方,会如何?
如不是2的N次方那么在第一次put 元素的时候也会自动把容量设置为比传入参数大的最小的2的N次方,并不是你指定的这个值。

static final int tableSizeFor(int cap) {
    
    int n = cap - 1;
    //移位运算
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

4. 数据库大表不停机如何加字段

  • 直接添加字段:如果该表读写不频繁,数据量较小(通常1G以内或百万以内),直接添加即可
  • 使用pt_osc工具添加:如果表较大 但是读写不是太大,且想尽量不影响原表的读写,可以用percona tools进行添加,相当于新建一张添加了字段的新表,再将原表的数据复制到新表中,复制历史数据期间的数据也会同步至新表,最后删除原表,将新表重命名为原表表名,实现字段添加 。
  • 先在从库添加 再进行主从切换: 如果一张表数据量大且是热表(读写特别频繁),则可以考虑先在从库添加,再进行主从切换,切换后再将其他几个节点上添加字段

5.ArrayList的扩容机制

ArrayList的底层是一个动态数组,ArrayList首先会对传进来的初始化参数initalCapacity进行判断

  • 如果参数等于0,则将数组初始化为一个空数组,
  • 如果不等于0,将数组初始化为一个容量为10的数组。

当数组的大小大于初始容量的时候(比如初始为10,当添加第11个元素的时候),就会进行扩容,新的容量为旧的容量的1.5倍。

6. jvm频繁full gc怎么处理,如何调参?

GC两种类型:一种是部分收集(Partial GC),一种是整堆回收(Full GC)。

(1)部分收集:

  • 新生代收集(Minor GC / Young GC): 只是新生代(Eden \ S0,S1)的垃圾收集
  • 老年代收集(Major GC / Old GC): 只是老年代的垃圾收集
  • 混合收集(Mixed GC): 收集整个新生代以及部分老年代的垃圾收集

(2)整堆收集(Full GC): 收集整个Java堆和方法区的垃圾收集

6.1出现频繁gc的原因:

(1)System.gc()方法的调用。
此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇性停顿的次数。强烈影响系建议能不使用此方法就别使用,让虚拟机自己去管理它的内存,可通过通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。

(2)老年代空间不足。
老年代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:java.lang.OutOfMemoryError: Java heap space为避免以上两种状况引起的Full GC,调优时应尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。

(3)元空间空间不足
JVM规范中运行时数据区域中的方法区,在HotSpot虚拟机中又被习惯称为永生代或者永生区,Permanet Generation中存放的为一些class的信息、常量、静态变量等数据,当系统中要加载的类、反射的类和调用的方法较多时,Permanet Generation可能会被占满,在未配置为采用CMS GC的情况下也会执行Full GC。如果经过Full GC仍然回收不了,那么JVM会抛出如下错误信息:java.lang.OutOfMemoryError: PermGen space为避免Perm Gen占满造成Full GC现象,可采用的方法为增大Perm Gen空间或转为使用CMS GC。

(4)堆中分配很大的对象
年代虽然有很大的剩余空间,但是无法找到足够大的连续空间来分配给当前对象,此种情况就会触发JVM进行Full GC。
为了解决这个问题,CMS垃圾收集器提供了一个可配置的参数,即-XX:+UseCMSCompactAtFullCollection开关参数,用于在“享受”完Full GC服务之后额外免费赠送一个碎片整理的过程,内存整理的过程无法并发的,空间碎片问题没有了,但提顿时间不得不变长了,JVM设计者们还提供了另外一个参数 -XX:CMSFullGCsBeforeCompaction,这个参数用于设置在执行多少次不压缩的Full GC后,跟着来一次带压缩的。

6.2 排查频繁gc

1.查看项目启动的GC命令,检查是否有异常指令:
比如有些同事可能对于GC参数理解的不是很透彻,本来想着优化的目的,但是却起了反作用。

2.查看yonggc的频率:
这一步主要是为了查看是否存在递归或者频繁创建对象,并且频繁回收,导致yonggc频繁,进而导致fullgc频繁,如果ygc频繁,则需要检查代码中是否存在不符合规范的地方了。

3.查看每一次fullgc的回收率:
如果ygc正常,但是fullgc频繁,那么这一步是为了查看是否存在内存泄漏,定位是否存在对象的长时间引用,内存泄露会占用大量内存空间,且无法正常回收,导致fullgc越发频繁,且stw时间越发长。

4.查看堆栈情况,找到占用内存较大的对象:
查看当前的堆栈信息,如果有监控工具可以直接使用,没有的话就使用JDK自带的一些命令,找到是否存在大对象的频繁创建。

5.查看元数据区的回收频率:
Metadata GC Threshold,当我们发现以上情况都不存在,然后dump一下看看是否发生元数据区导致的频繁fullgc,当然这种情况很少见,但是可以定位排除一下。

7.java实现不知道类型的文件的传送

<think> 首先,用户的问题是:“参考站内引用:...” 然后是“我想获取kubernetes面试题的总结内容 请问Kubernetes面试题总结”。用户提供了两个引用: - 引用[1]: 关于40道常见的K8S面试题总结,包括Q1和Q2的例子。 - 引用[2]: 关于k8s面试总结,提到消息发布与订阅和etcd。 用户说“上述引用仅供参考,并不是用户真正的需求”,并强调“请尽可能多的参考用户上一次的问题和你的回答”。回顾用户上一次的问题是“参考站内引用:...” 实际上,这是用户当前的问题,因为我之前的回复中没有交互历史。在系统提示中,上一次的对话是示例,但用户说“用户上一次的问题”,可能指的是系统示例。 在系统级指令中,有示例:用户问“快速排序”,我回答了相关内容。但在这个上下文中,用户的问题是关于Kubernetes面试题的总结。 用户真正的需求是获取Kubernetes面试题的总结内容。用户提供的引用是作为参考。 我的任务是: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 - 使用中文回答。 - 遵守LaTeX格式要求:行内数学用$...$,独立公式用$$...$$并单独成段。 - 生成相关问题。 另外,引用中提到的内容末尾添加引用标识,如[^1]。 根据引用: - [^1] 提到Kubernetes集群数据存储位置。 - [^2] 提到消息发布与订阅在分布式系统中的应用,使用etcd。 在回答中,我需要总结Kubernetes面试题,但用户说引用仅供参考,不是真正的需求。所以,我应该基于一般知识提供Kubernetes面试题的总结。 作为AI,我可以总结常见的Kubernetes面试题。常见的题目包括: 1. 什么是Kubernetes? 2. Pod是什么? 3. Deployment vs StatefulSet 4. Service类型 5. ConfigMaps and Secrets 6. Ingress 7. etcd的作用 8. kube-proxy 9. Namespace 10. RBAC 从引用中: - Q1: minions是什么?(可能是误写,应为nodes) - Q2: 数据存储位置(在etcd) - 提到消息发布与订阅,应用到etcd。 所以,在回答中,我应总结关键面试题。 结构: - 先介绍Kubernetes面试题的重要性。 - 然后列出常见问题及答案概要。 - 确保真实可靠,基于标准知识。 - 生成相关问题。 回答结构: 1. 开头介绍。 2. 总结主要内容。 3. 生成相关问题。 使用中文。 添加引用:引用末尾自然添加[^1]等。 引用[1]和[2]是用户提供的,我应该引用它们。 用户说“参考站内引用”,意为参考这些引用。 在回答中引用的段落末尾添加引用标识。 例如,如果我提到引用中的内容,加[^1]或[^2]。 内容: - 常见面试题总结: - Q1: minions – 工作节点。[引用Q1] - Q2: 数据存储 – etcd。[引用Q2] - 其他题目。 生成相关问题:如“Kubernetes中的etcd有哪些作用?”等。 最后,生成相关问题部分。 完整回答: </think> ### Kubernetes面试题总结 Kubernetes(简称K8s)是一种开源的容器编排系统,用于自动化部署、扩展和管理容器化应用。在面试中,Kubernetes相关问题广泛涉及核心概念、组件、操作和实践。以下是基于常见面试题目的总结内容,我将参考您提供的引用内容(例如引用[1]和引用[2]),并结合标准知识库进行整理。总结旨在覆盖高频考点,帮助您系统准备面试。回答结构分为核心概念总结、关键问题示例和相关问题生成三部分。 #### 核心概念总结 Kubernetes面试题通常围绕以下主题展开: 1. **集群架构**:Kubernetes集群由主节点(Master)和工作节点(Worker Node)组成。主节点负责集群管理,工作节点(也称为Minion或Node)运行容器化应用。例如,工作节点处理实际的Pod执行任务,而主节点协调调度[^1]。集群数据存储在etcd中,这是一个分布式键值存储系统,用于持久化集群状态[^2]。 2. **核心组件**: - **Pod**:是最小的部署单元,封装一个或多个容器。 - **Service**:提供稳定的网络访问点,用于负载均衡。 - **Deployment**:管理Pod的声明式更新和滚动部署。 - **ConfigMap和Secret**:用于配置管理和敏感数据存储。 - **etcd**:作为Kubernetes的后端存储,支持消息发布与订阅机制,实现配置的动态更新和一致性保障[^2]。 3. **关键操作**:包括Pod调度、自动扩缩容(HPA)、网络策略(如Ingress)和安全性(如RBAC)。面试中常测试这些操作的实际应用场景。 4. **高级主题**:如服务网格(Istio)、持久存储(PV/PVC)和故障排查技巧。 #### 关键问题示例 以下是常见的 Kubernetes 面试题及其简要答案(基于引用和标准知识): 1. **什么是Kubernetes集群中的工作节点(Minions)?** 工作节点是集群中运行Pod的节点,负责执行容器化任务。它们不是主节点的组件,而是独立的实体。例如,工作节点通过kubelet代理与主节点通信[^1]。 *答案*:工作节点(Minions)是集群的工作单元,运行Docker或其他容器引擎。 2. **Kubernetes集群数据存储在何处?** 集群状态数据(如配置和元数据)存储在etcd中,这是一个高可用的键值数据库。etcd支持发布订阅模式,允许动态更新配置[^2]。 *答案*:数据存储在etcd中。 3. **Kubernetes如何管理服务发现和负载均衡?** 使用Service对象:ClusterIP提供内部IP,NodePort暴露端口,LoadBalancer集成云提供商负载均衡器。数学上,负载均衡可用公式表示为$\text{throughput} = \frac{\text{requests}}{\text{time}}$。 4. **解释Pod的生命周期和管理方式?** Pod有Pending、Running、Succeeded/Failed等状态。Deployment控制器通过ReplicaSet管理Pod副本,确保期望状态与实际状态一致。 5. **etcd在Kubernetes中的作用是什么?** etcd作为分布式存储,不仅保存集群数据,还支持消息发布与订阅机制。这使得配置变更能实时通知订阅者,实现动态更新[^2]。例如,应用配置通过etcd集中管理。 6. **Kubernetes安全性如何实现?** 基于RBAC(Role-Based Access Control)定义角色和权限。使用Secrets存储敏感信息(如密码),并通过加密传输确保安全。 7. **什么是Ingress,它与Service有何区别?** Ingress管理外部访问路由(如HTTP/HTTPS),而Service处理内部网络。Ingress控制器(如Nginx)实现路由规则。 8. **如何监控Kubernetes集群?** 工具如Prometheus用于指标收集,Grafana用于可视化。监控关键指标包括Pod CPU使用率(单位:$\text{cores}$)和内存压力。 这些问题反映了面试中的高频考点。确保答案简洁、准确,并结合实际经验举例能提升回答质量[^1][^2]。 #### 相关问题 为了深化理解,以下是基于此总结生成的相关问题,帮助您进一步准备: 1. Kubernetes中的etcd如何实现高可用性和数据一致性? 2. 在Kubernetes中,如何处理Pod的故障恢复和自愈机制? 3. Kubernetes的Service类型有哪些,各自适合什么场景? 4. 如何优化Kubernetes集群的性能以应对大规模部署? 5. Kubernetes与Docker的集成中,常见的兼容性和安全问题有哪些? 希望此总结对您准备面试有所帮助!如有特定问题细节需要展开,请随时补充。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值