「高级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请求
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的架构:
- netty架构主要包含了两个事件循环组:BossGroup 和 WorkerGroup。
- BoosGroup 用于专门创建连接,其中有多个事件循环线程,每个事件循环都监听对应通道的建立连接请求并进行处理。
- WorkGroup 中也有多个事件循环线程,负责对应通道的IO事件。一个线程可以负责多个通道的IO,实现了IO多路复用。
2. 使用零拷贝技术减少数据在内存中的拷贝次数
磁盘中的数据发送到网络的过程:
- 磁盘数据先拷贝到内核缓冲区
- 再拷贝到应用程序内存
- 再拷贝到Socket缓冲区
- 最后再发向网络
数据在内存中拷贝了两次,一次是内核缓冲区到用户程序内存,另一次是应用程序内存到Socket缓冲区。零拷贝技术,可以将内核缓冲区、应用程序内存、Socket缓冲区建立了地址映射,无需拷贝,大幅提升IO性能。
「高级java工程师」常见面试题及其答案(持续更新)相关推荐
- 「java工程师」常见面试题及其答案(持续更新)
「高级java工程师」常见面试题及其答案: 「高级java工程师」常见面试题及其答案(持续更新)_好人老李的博客-CSDN博客 目录 java基础 面向对象与面向过程的区别? JRE.JDK.JVM的 ...
- while循环中指针会自动释放吗_C++】C++常见面试题汇总_持续更新中...
1:指针(*).引用(&).解引用(*).取地址(&).的概念和区别 概念: 指针指向一块内存,指针保存的是内存的地址:引用是变量的别名,本质是引用该变量的地址. 解引用是取指针指向的 ...
- Java多线程常见面试题及答案汇总1000道(春招+秋招+社招)
Java多线程面试题以及答案整理[最新版]Java多线程高级面试题大全(2021版),发现网上很多Java多线程面试题都没有答案,所以花了很长时间搜集,本套Java多线程面试题大全,汇总了大量经典的J ...
- 总结Java常见面试题和答案
转载自 总结Java常见面试题和答案 int和Integer有什么区别? 答:int是java的原始数据类型,Integer是java为int提供的封装类,java为每个原始数据类型都提供了封装 ...
- 【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习 面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.觉得内容不错 ...
- java常见面试题及答案 1-10(基础篇)
java常见面试题及答案 1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程.Java 源文件被 ...
- java中级程序员面试题_中级Java程序员常见面试题汇总
下面是一些中级Java程序员常见面试题汇总,你可以用它来好好准备面试. 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器 ...
- java线程池面试题有哪些?java线程池常见面试题
进行java面试的过程中,java线程池是必问的面试题目,因为这是java的重点知识,也是在java工作中经常会遇到的,那java线程池面试题有哪些?下面来我们就来给大家讲解一下java线程池常见面试 ...
- java常见面试题及答案 1-10
java常见面试题及答案 1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程.Java 源文件被 ...
最新文章
- limma包分析差异表达基因
- ChipScope Pro核生成器
- c语言printf相关函数 格式化字符串攻击 简介
- 不同操作系统之间的网络配置
- 把佳佳的博客搬出去了
- BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP + 带权重心
- 总结python处理图片等比例压缩与质量处理的方法
- 一文详解微服务架构的数据设计
- [转载] ANTLR——嵌入文法的Actions
- ios 内联函数 inline ---分解LFLiveKit
- 设置和开通freebsd远程登录
- C# 获取打开的EXCEL中某列的行数
- 【软考系统架构设计师】2020年下系统架构师综合知识历年真题
- 腾讯翻译君API使用笔记
- 中国高分辨率国家土壤信息格网基本属性数据集
- 《Android开发艺术探索》超详细笔记【转载】
- 计算机考研人工智能选什么方向,我想报人工智能方向的研究生,应该选取什么专业?...
- 架构师是否需要深入代码?
- python - 例题分析:工时与工资
- WXpython下载很慢安装包教程,直接安装不上,只好把所有包下载下来