「高级java工程师」常见面试题及其答案(持续更新)

「java工程师」常见面试题及其答案请见:

「java工程师」常见面试题及其答案(持续更新)_好人老李的博客-CSDN博客

目录

java基础

常用的 jvm 调优方法?

OOM的常见场景及其原因、解决方法?

netty

什么是netty?

netty的优点?

netty的使用场景?

netty的原理?


java基础

常用的 jvm 调优方法?

1. 利用命令、工具查问题,优化代码

一般我们是「遇到问题」之后才进行调优,用各种的「工具」进行排查。

  • 使用 ps -ef|grep java 查看java进程id
  • jstat -gc 进程id //查看年轻代、老年代等区域的内存使用情况、垃圾回收次数/消耗时间
  • jmap生成堆转储快照dump文件,再使用MAT( Memory Analyzer tool 内存解析工具)分析

2. 调整参数,以减少GC的频率、减少Full GC次数

  • 调整堆大小:-Xmx:设置堆的最大值、-Xms:设置堆的初始值
  • 调整年轻代、老年代内存占比:-Xmn:年轻代的大小

3. 无法继续优化,就扩容

OOM的常见场景及其原因、解决方法?

1. 堆溢出:java.lang.OutOfMemoryError: Java heap space

原因:

  • 存在大对象
  • 存在内存泄漏,导致多次GC后,还是无法找到足够大的内存容纳对象

2. 方法区溢出

  • 永久代溢出:java.lang.OutOfMemoryError:PermGen space
  • 元空间溢出:java.lang.OutOfMemoryError: Metaspace,JDK8后,元空间替换了永久代,元空间使用的是本地内存,溢出的概率变小

原因:

  • 运行期间生成了大量类,应用程序长时间运行没有重启,导致方法区被撑爆
  • 元空间内存设置过小

3. 线程溢出:Java.lang.OutOfMemeoryError:unable to create new native thread

原因:创建了大量的线程导致的

4. StackOverflowError

        原因:递归调用导致堆栈空间用尽

解决方法:

1、查代码:大对象,内存泄漏

2、利用工具分析内存泄漏:通过jmap命令把堆内存dump下来,使用MAT分析

3、加堆内存、加机器

netty

什么是netty?

  • netty是1个java网络通信框架,性能很好,基于事件驱动、异步的思想
  • 我们熟知的Dubbo、Rocketmq、Hadoop等都使用它作为底层的通信组件。

netty的优点?

  • API使用简单,学习成本低。
  • 性能高,对比其他主流的NIO框架,Netty的性能最优。
  • Dubbo、Elasticsearch都采用了Netty,可用性得到验证。

netty的使用场景?

        分布式系统中,各个节点之间需要远程服务调用,高性能的RPC框架必不可少。Netty作为高性能的网络通信框架,往往作为基础的通信组件被这些RPC框架使用。比如:阿里分布式服务框架Dubbo的RPC框架使用Netty作为基础通信组件,用于实现各进程节点之间的内部通信。

netty的原理?

1. 基于NIO实现IO多路复用,利用一个线程可以并发处理多个io请求

「高级java工程师」常见面试题及其答案(持续更新)_第1张图片

NIO原理:

  • 服务器为每个客户端分配单独的Channel和Buffer,数据通过通道 Channel 传输的,往Channel中读写数据需要先经过缓冲区Buffer。
  • 将每个客户端对应的Channel的IO事件注册到多路复用器 Selector上,Selector通过轮询,就可以找到有IO活动的channel并进行处理,实现一个线程可以非阻塞地处理多个客户端的IO请求。
  • 这种IO处理模式也称为Reactor模式

netty参考了主从Reactors多线程模型:

  • MainReactor负责客户端的连接请求,并将请求转交给SubReactor
  • SubReactor负责相应通道的IO读写请求
  • 非IO请求(具体逻辑处理)的任务则会直接写入队列,等待worker threads进行处理

netty的架构:

「高级java工程师」常见面试题及其答案(持续更新)_第2张图片

  • netty架构主要包含了两个事件循环组:BossGroup 和 WorkerGroup。
  • BoosGroup 用于专门创建连接,其中有多个事件循环线程,每个事件循环都监听对应通道的建立连接请求并进行处理。
  • WorkGroup 中也有多个事件循环线程,负责对应通道的IO事件。一个线程可以负责多个通道的IO,实现了IO多路复用。

2. 使用零拷贝技术减少数据在内存中的拷贝次数

「高级java工程师」常见面试题及其答案(持续更新)_第3张图片

磁盘中的数据发送到网络的过程:

  1. 磁盘数据先拷贝到内核缓冲区
  2. 再拷贝到应用程序内存
  3. 再拷贝到Socket缓冲区
  4. 最后再发向网络

数据在内存中拷贝了两次,一次是内核缓冲区到用户程序内存,另一次是应用程序内存到Socket缓冲区。零拷贝技术,可以将内核缓冲区、应用程序内存、Socket缓冲区建立了地址映射,无需拷贝,大幅提升IO性能。

你可能感兴趣的:(java,面试)