2021上半年面试问题总结

7 篇文章 0 订阅
3 篇文章 0 订阅

:如果JVM发生了内存泄漏,如何定位是哪块区域出现了内存泄漏?(未答出来)

  1. 确定频繁Full GC现象
      a.首先通过“虚拟机进程状况工具:jps(JVM Process Status Tool)”找出正在运行的虚拟机进程,最主要是找出这个进程在本地虚拟机的唯一ID(LVMID,Local Virtual Machine Identifier),因为在后面的排查过程中都是需要这个LVMID来确定要监控的是哪一个虚拟机进程。(假设是ID是20954)
      jps命令格式:
        jps [ options ] [ hostid ]
        使用命令如下:
        使用jps:jps -l : 参数-l列出机器上所有jvm进程

      b.再利用“虚拟机统计信息监视工具:jstat(JVM statistics Monitoring)”是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

        jstat命令格式:
        jstat - gcutil pid time :-gcutil 监控jvm的gc信息,pid 监控的jvm进程id,time每个多少毫秒刷新一次;参数也可以是-gc: -gc会显示每个区的容量和使用量。

    如下图(从别人那拿的,我自己本地就不贴了):
    在这里插入图片描述
      jstat执行结果:
      查询结果表明:这台服务器的新生代Eden区(E,表示Eden)使用了28.30%(最后)的空间,两个Survivor区(S0、S1,表示Survivor0、Survivor1)分别是0和8.93%,老年代(O,表示Old)使用了87.33%。程序运行以来共发生Minor GC(YGC,表示Young GC)101次,总耗时1.961秒,发生Full GC(FGC,表示Full GC)7次,Full GC总耗时3.022秒,总的耗时(GCT,表示GC Time)为4.983秒。
  2. 找出导致频繁Full GC的原因
      使用“Java内存影像工具:jmap”生成堆转储快照(一般称为headdump或dump文件)。

        jmap命令格式:
        jmap [ option ] vmid
        使用命令如下:
        jmap -histo:live 20954

    这里再借用写别人图(手动狗头)
    在这里插入图片描述

:线上的java应用程序CPU 利用率高/飙升,该怎么处理?

  1. 先使用top命令定位CPU使用率最高。
  2. top -Hp pid 定位使用 CPU 最高的线程。
  3. printf ‘0x%x’ tid 线程 id 转化 16 进制。
  4. jstack pid | grep tid 找到线程堆栈。
    详细解答,可以参考地址在这里(https://ricstudio.top/archives/java-online-question-probe)


  使用ConcurrentHashMap替换HashMap有什么需要注意的么?或者说可以直接替换么,还是需要做什么处理?(未答出来)

  相对与HashMap来讲ConcurrentHashMap是线程安全的因为ConcurrentHashMap是有分区锁(jdk1.8)的。在ConcurrentHashMap中键值均不能为null,HashMap的键值均可以为null。
追问
  为什么ConcurrentHashMap的键值不可以为null而HashMap的键值可以为null呢?

  因为ConcurrentHashMap是线程安全的,所以我们一般会在并发的情况下使用它: 假设现在有这么个场景A,B线程,A线程map.get(key),map中实际不存在这个key,那么这个时候调用map.containsKey(key)确实应该返回null,但是B线程对A读的这个key又put了一个value为null的值。那么实际上返回的null就是key对应的值了,这种情况下,返回null就产生了二义性。但是hashMap可以存在键值均为null,就是我们一般都是在单线程的情况下使用它,当调用hashMap.containsKey(key)的时候,并不会有另外一个线程更改该map,所以不会有二义性。
具体可以参考该文:https://juejin.cn/post/6844904023229726728

:Mysql的索引为什么选择使用B+树实现?

  1、B+树能显著减少IO次数,提高效率
  2、B+树的查询效率更加稳定,因为数据放在叶子节点
  3、B+树能提高范围查询的效率,因为叶子节点指向下一个叶子节点
加问:问什么B+树可以减少IO次数?

  IO次数主要与树的高度相关,相对与B树来说,B+树的节点是不存储数据的,每个节点只存放索引值,这个的话相同大小的节点,B+树比B树可以放更多的节点,这样就可以减少数据的高度,而且从磁盘中读取数据时一般是一页一页读取的,每页中也能够读取到更多的索引节点。

  :现在有一批集群部署的机器,如何指定机器运行后台的定时任务?(当时没答出来,工作中确实没遇到过)
  :集群环境下,机器会有多个,需要执行某个或者多个机器执行后台任务,否则可能会一个数据多个机器同时处理导致bug。
  使用 spring的@Conditional 注解,判断是本机ip才加载对应的任务的service,非配置的ip的机器则不会加载到spring容器。在实现condition接口的类中判断当前机器的IP与系统配置的执行定时任务的IP是否相同。
  在标有@Service业务类中添加@@Conditional 注解,值是上面实现了condition接口的类。
具体可参考地址(点这里)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值