1.Java中如何排查内存溢出1.1内存不足的核心原因java中内存溢出的原因有两个JVM堆/非堆内存分配不足或内存泄漏使可用内存被耗尽我们需要定位内存消耗大项和区分内存是泄露还是真的不足1.2内存为什么会泄露内存泄露的本质是本来被GC回收的对象被意外持有引用导致无法回收一直占用内存最终导致可用内存越来越少常见场景有静态集合类持有对象引用长生命周期对象持有段生命周期对象引用未关闭的IO/连接/监听器缓存使用不当线程未停止等1.3排查步骤1.3.1确认内存泄漏通过工具观察堆内存各区域Eden、Survivor、Old Gen的使用情况判断是否存在内存无法释放的情况分析GC日志查看Full GC频率耗时以及内存释放情况。1.3.2抓取内存快照即JVM堆在某一时刻的完整镜像1.3.3分析内存快照通过工具分析快照定位泄露对象识别异常对象查看是否有对象数量异常或者生命周期异常查看引用链查看是否有对象被意外劫持导致无法被回收1.4常用工具jps查看进程IDjstat实时监控JVM内存和GC状态jmap生成堆快照查看对象分布jconsole/jvisualvm图形化工具2.HashMap的底层原理了解吗HashMap是基于红黑树链表数组的哈希表实现用于存储键值对key—value其核心原理如下2.1哈希计算与扰动处理当插入或查询数据时使用key.hashcode()方法获取哈希值并赋值给一个变量h再h ^ (h 16)将高 16 位和低 16 位做异或运算把高位信息混入低位减少哈希碰撞概率2.2索引定位使用n-1hash获取bucket下标效率比取模高2.3冲突处理若桶节点为空直接放入节点若存在节点则逐个比较若equals()相等则覆盖若不等于则放到链表尾部当单个桶内节点数8数组容量64时链表转为红黑树2.4扩容机制默认初始容量为16负载因子0.75当元素超过阈值16*0.75数组变成2倍并且重新分配节点用node.hasholdCap判断留在原位置还是ioldCap