2023年企业Java面试题精选
前言:因为文档为pdf格式,转化后可能出现错字或乱码,
内容过多大家可能也不能一直停留在这个界面,我直接无偿分享给大家
获取方法:
关注后,后台私信白嫖就可以了.


正片开始!
目录
一、性能优化面试专栏
1.1、tomcat性能优化整理
1.2、JVM性能优化整理
1.3、MysqI性能优化整理
二-、微服务架构面试专栏
2.1、SpringCloud面试整理
2.2、SpringBoot面试整理
2.3、Dubbo面试整理
三、并发编程高级面试专栏
四、开源框架面试题专栏
4.1、Spring面试整理
4.2、SpringMVC面试整理
4.3、MyBatis面试整理
五、分布式面试专栏
5.1、分布式限流面试整理
5.2、分布式通讯面试整理
5.3、分布式数据库面试整理

一、性能优化专栏
1.1、 tomcat性能优化整理
1、你怎样给tomcat调优
1. JVM参数调优: -Xms<s ize>表示JVM初始化堆的大小,-
Xmx<size>表示JVM堆的最大值。这两个值的大小一般根据需要进行设
置。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,
并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大
值的80%。在catalina.bat 中,设置JAVA _OPTS= '-Xms256m-
Xmx512m',表示初始化内存为256MB, 可以使用的最大内存为512MB。
2.禁用DNS查询
当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或
者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络,并
且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP
的过程,这样会消耗-定的时间。 为了消除DNS查询对性能的影响我们可
以关闭DNS查询,方式是修改| server . xml文件中的enableLookups 参数值

3.调整线程数
通过应用程序的连接器(Con nector)进行 性能控制的的参数是创建的
处理请求的线程数。Tomcat 使用线程池加速响应速度来处理请求。在
Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关
的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序
员写出CPU最大利用率的高效程序,使空闲时间保持最低,从而接更多的
请求。
| Tomcat4中可以通过修改minProcessors和maxProcessors的值来控
制线程数。这些值在安装后就已经设定为默认值并且是足够使用的,但是
随着站点的扩容而改大这些值。minProcessors 服务器启动时创建的处
理请求的线程数应该足够处理一个小量的负载。也就是说,如果-天内每
秒仅发生5次单击事件,并且每个请求任务处理需要1秒钟,那么预先设置
线程数为5就足够了。但在你的站点访问量较大时就需要设置更大的线程
数,指定为参数maxProcessors的值。maxProcessors 的值也是有上
限的,应防止流量不可控制(或者恶意的服务攻击),从而导致超出了虛
拟机使用内存的大小。如果要加大并发连接数,应同时加大这两个参
数。web server允许的最大连接数还受制于操作系统的内核参数设置,
通常Windows是2000个左右,Linux是1000个左右 。
在Tomcat5对这些参数进行了调整,请看下面属性:
maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示
Tomcat可创建的最大的线程数。
| acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可
以放到处理队列中的请求数,超过这个数的请求将不予处理。
| connnection Timeout网络连接超时,单位:毫秒。设置为0表示永不
超时,这样设置有隐患的。通常可设置为30000毫秒。
minSpareThreadsTomcat初始化时创建的线程数。
maxSpareThreads -旦创建的线程超过这个值,| Tomcat 就会关闭不再
需要的socket线程。
最好的方式是多设置几次并且进行测试,观察响应时间和内存使用情况。
在不同的机器、操作系统或虚拟机组合的情况下可能会不同,而且并不是
所有人的web站点的流量都是-样的,因此没有-刀切的方案来确定线程
数的值。
2、如何加大comcat连接数
在tomcat配置文件server . xml中的<Connector/>
配置中,和连接数相关的参数有:
minProcessors |:最小空闲连接线程数,用于提高系统处理性能,默认
值为10
maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认
值为75
| acceptCount :允许的最大连接数,应大于等于maxProcessors,默
认值为100
| enableLookups: 是否反查域名,取值为: true或false。 为了提高处理能
力,应设置为false
| connect ionTimeout |: 网络连接超时,单位:毫秒。设置为0表示永不
超时,这样设置有隐患的。通常可设置为30000毫秒。
其中和最大连接数相关的参数为maxProcessors和acceptCount。如果要加
大并发连接数,应同时加大这两个参数。
web server 允许的最大连接数还受制于操作系统的内核参数设置,通常
Windows是2000个左右,Linux是 1000个左右。tomcat5中的配置示例:

对于其他端口的侦听配置,以此类推。
3、怎样加大tomcat的内存
首先检查程序有没有限入死循环
这个问题主要还是由这个问题java. lang. OutOfMemoryError:Java
heap space
引起的。第一次出现这样的的问题以后,引发了其他的问题。在网上一查
可能是JAVA的堆栈设置太小的原因。
跟据网.上的答案大致有这两种解决方法:
1、设置环境变量
解决方法:手动设置Heap size
修改TOMCAT_ HOME/bin/catalina. sh
setJAVA_ _OPTS= -Xms32m- -Xmx512m
可以根据自己机器的内存进行更改。
2、java- -Xms32m- -Xmx800m className
就是在执行JAVA类文件时加上这个参数,其中className
是需要执行的确类名。(包括包名) 这个解决问题了。而且执行的速度比
没有设置的时候快很多。如果在测试的时候可能会用Eclispe这时候就需要
在Eclipse ->run- arguments中的M arguments 中输入| -Xms32m-
Xmx80m这个参数就可以了。
后来在Eclilpse中修改了启动参数,在VMarguments
加入了-Xms32m- -Xmx800m,问题解决。
一、java. lang . OutOfMemoryError:PermGen space
PermGen space 的全称是Pe rmanent Generation space ,是指内存的
永久保存区域,
这块内存主要是被JVM存放Class和Meta信息的,Class在被L oader时就会被
放到PermGen space 中,它和存放类实例(Instance)的Heap区域不
同,GC(Garbage Collection) 不会在主程序运行期对PermGen space
进行清理,所以如果你的应用中有很多CL ASS的话,
就很可能出现PermGen space 错误,这种错误常见在web服务器对JSP进
行preco mpile的时候。如果你的WEB APP下都用了大量的第三方jar,
其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法:手动设置MaxPermSize大小修
改TOMCAT HOME/bin/catalina.sh
在"echo"Using CATALINA_ BASE: $CATALINA_ BASE"". 上面加入以下
行: JAVA _0PTS="-server- XX: PermSize=64M- XX:MaxPermSize=128m
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样
可以达到减少jar文档重复占用内存的目的。
二、java. lang. OutOfMemoryError:Java heap space
Heap size设置
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设
置.JVM在启动的时候会自动设置Heap size 的值,
其初始空间(即-Xms)是物理内存的1/64,最大空间| (-Xmx) 是物理内存
的1/4。可以利用JMM提供的-Xmn -Xms -Xmx 等选项可进行设置。Heap
size的大小是Young Generat ion和TenuredGeneraion
之和。
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%
的时候将抛出此异常信息。
提示: Heap Size 最大不要超过可用物理内存的80%,-般的要将一
Xms和I-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
解决方法:手动设置Heap size
修改TOMCAT_ HOME/bin/catalina. sh
在"echo"Us ing CATALINA_ BASE:$CATALINA BASE""上面加入以下行:
| JAVA_ 0PTS="-server-Xms800m- -Xmx800m- Xx:MaxNewSize=256m"
三、实例,以下给出1G内存环境下java jvm的参数设置参考:
JAVA_ OPTS="-server- -Xms800m- -Xmx800m- XX: PermSize=64M-
XX:MaxNewSize=256m- -XX:MaxPermSize=128m-
Dj ava . awt . headless=true"
很大的web工程,用tomcat默认分 配的内存空间无法启动,如果不是在
myeclipse中启动tomcat可以对tomcat
这样设置:
| TOMCAT_ HOME/bin/ catalina. bat中添加这样-句话:
set JAVA_ 0PTS=- server-Xms2048m- -Xmx4096m- XX: PermSize=512M-
XX:MaxPermSize=1024M-Duser . t imezone=GMT+08
或者
| set JAVA OPTS= -Xmx1024M- Xms512M- Xx:MaxPermSize= 256m
如果要在myeclipse中启动,上述的修改就不起作用了, 可如下设置:
Myeclipse- >preferences->myeclipse- >servers->tomcat-
>tomcatx.x->JDK面板中的Opt ional Java VM arguments 中添加:日
Xmx1024M- Xms512M- -XX:MaxPermSize=256m
以上是转贴,但本人遇见的问题是:在myeclipse中启动Tomcat时, 提
示"ava. lang . OutOfMemoryError:Java heap space", 解决办法就
是:Myeclipse- ->preferences- ->myec Lipse>servers->tomcat-
>tomcatx.x->JDK面板中的
Optional Java VM arguments 中添加: -Xmx1024M- -Xms512M-
XX:MaxPermSize=256m
4、tomcat中如何禁止列目录下的文件
在| {tomcat_ home}/ conf/web. xml中,把itings参 数设置成false即可,
如下:

5、Tomcat有 几种部署方式
tomcat中四种部署项目方法
第一种方法:
在tomcat中的conf目录中,在server . xml中的,,<host/> 节点中
添加:


至于Context节点属性,可详细见相关文档。
第二种方法:
将web项目文件件拷贝到webapps目录中。
第三种方法:
很灵活,在conf目录中,新建Catalina (注意大小写)
\| localhost目录,在该目录中新建一个xml文件,名字可以随意取,
只要和当前文件中的文件名不重复就行了,该xml文件的内容为:

第3个方法有个优点,可以定义别名。服务器端运行的项目名称
为path,外部访问的URL 则使用XML 的文件名。这个方法很方便的隐
藏了项目的名称,对一些项目名称被固定不能更换,但外部访问时又想换
个路径,非常有效。
第2、3还有优点,可以定义一些个性配置,如数据源的配置等。
第四种办法:
可以用tomcat 在线后台管理器,一般tomcat都打开了,直接上传war
就可以
6. Tomcat的优化经验
| Tomcat作为web服务器,它的处理性能直接关系到用户体验, 下面是种
常见的优化措施:
●去掉对web.xml的监视,把jsp提前编辑成Servlet。有富余物理内
存的情况,加大tomcat使用的jvm 的内存。
●服务器资源
服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。
●对于高并发情况下会有大量的运算,那么CPU的速度会直接影响到处理
速度。
,内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用
-Xmx -Xms- XX:MaxPermSize等参数对内存不同功能块进行划分。我们之
前就遇到过内存分配不足,导致虚拟机-直处于full GC,从而导致处
理能力严重下降。
●硬盘主要问题就是读写性能,当大量文件进行读写时,磁盘极容易成为
性能瓶颈。最好的办法还是利用下面提到的缓存。
●利用缓存和压缩
对于静态页面最好是能够缓存起来,这样就不必每次从磁盘上读。这里我
们采用了Nginx作为缓存服务器,将图片、css、 js文件都进行了缓存,有
效的减少了后端tomcat的访问。另外,为了能加快网络传输速度,开启
gzip压缩也是必不可少的。但考虑到tomcat已经需要处理很多东西了,所
以把这个压缩的工作就交给前端的Nginx来完成。
除了文本可以用gzip压缩,其实很多图片也可以用图像处理工具预先进行
压缩,找到一个平衡点可以让画质损失很小而文件可以减小很多。曾经我
就见过-个图片从300多kb压缩到几十kb,自己几乎看不出来区别。
●采用集群
单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建
tomcat集群是有效提升性能的手段。我们还是采用了Nginx来作为请求分
流的服务器,后端多个tomcat共享session来协同工作。可以参考之前写的
《利用nginx+tomcat+memcached组建web服务器负载均衡》。
●优化tomcat参数
这里以tomcat7的参数配置为例,需要修改conf/serve.xmlI文件,主要是优
化连接配置,关闭客户端dns查询。


1.2、JVM性能优化专题
1. Java类加载过程
Java类加载需要经历一下7个过程:
1.加载
加载是类加载的第一个过程, 在这个阶段,将完成一下三件 事情:
●通过一个类的全限定名获取该类的二进制流。
●将该二进制流中的静态存储结构转化为方法去运行时数据结
构。
●在内存中生成该类的Class对象,作为该类的数据访问入口。
2.验证
验证的目的是为了确保Class文件的字节流中的信息不回危害到
虚拟机.在该阶段主要完成以下四钟验证:
●文件格式验证:验证字节流是否符合Class文件的规范,如主次版本号
是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型.
●元数据验证:对字节码描述的信息进行语义分析,如这个类是否有父类,
是否集成了不被继承的类等。
●字节码验证:是整个验证过程中最复杂的一个阶段,通过验证数据流和
控制流的分析,确定程序语义是否正确,主要针对方法体的验证。如:方
法中的类型转换是否正确,跳转指令是否正确等。
●符号引用验证:这个动作在后面的解析过程中发生,主要是为了确保解
析动作能正确执行。
3.准备
准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都
将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变
量将会在对象实例化时随着对象-起分 配在Java堆中。

内容过多大家可能也不能一直停留在这个界面,我直接无偿分享给大家
获取方法:
关注后,后台私信白嫖就可以了.