Java面试题持续整理ing
- 一、性能优化面试专题
- 二、微服务架构面试专题
- 三、并发编程面试专题
-
-
- 1、你用过Synchronized吗?知道Synchronized原理吗?
- 2、你获取到的“锁”,它到底是什么?如何确定对象的锁?
- 3、什么是锁的可重入性,为什么说Synchronized是可重入锁呢?
- 4、JVM对Java中的原生锁做了哪些优化?
- 5、为什么说Synchronized是非公平的锁呢?
- 6、什么是锁小升初和锁粗化?
- 7、为什么说Synchronized是一个悲观锁?乐观锁的实现原理又是什么?什么是CAS?
- 8、乐观锁一定就是好的吗?
- 9、跟Synchronized相比,可重入锁ReentrantLock的实现原理有什么不同呢?
- 10、请谈谈AQS框架是怎么回事儿?
- 11、对比Synchronized和ReentrantLock的异同
- 12、ReentrantLock是怎么实现可重入性的?
- 13、除了ReentrantLock,你还接触过JUC中哪些并发工具?
- 14、请谈谈ReadWriteLock和StampedLock(1.8)的区别有哪些?
- 15、如何让java的线程彼此同步?你了解过哪些同步器?请分别介绍下。
-
- 四、开源框架面试专题
一、性能优化面试专题
tomcat性能优化
1、怎么给你的tomcat调优
1、JVM的调优参数:-Xms表示初始化堆的大小,-Xmx表示JVM堆的最大值。这两个值的大小一般是根据需要设置的,当程序需要的内存超出堆内存的最大值的时候就会提示内存溢出(OOM)。并且导致服务崩溃,应用宕机。因此一般建议堆的最大值设置为可用内存的最大值的80%,在tomcat中的catalina.bat 里,设置 JAVA_OPTS=’-Xms256m-Xmx512m’,表示初始化内存为256MB,可以使用的最大内存为512MB。
2、禁用DNS查询:当web应用程序像要记录客户端的信息时候,他会记录客户端的ip地址或者通过域名服务器查找机器名转化为ip地址。DNS查询需要占用网络,并且包括可能从很远的服务器或者不起作用的服务器上去获取对应的ip的过程,这样会消耗一定的时间。为了消除DNS查询对应能的影响我们可以关闭DNS查询,方式是修改tomcat中的server.xml文件中的enableLookups这个参数的值:
Tomcat4
<Connector
className="org.apache.coyote.tomcat4.CoyoteConnector"port="80"
minProcessors="5"maxProcessors="75"enableLookups="false"redire
ctPort="8443"
acceptCount="100"debug="0"connectionTimeout="20000"
useURIValidationHack="false"disableUploadTimeout="true"/>
Tomcat5
<Connectorport="80"maxThreads="150"minSpareThreads="25"
maxSpareThreads="75"enableLookups="false"redirectPort="8443"
acceptCount="100"debug="0"connectionTimeout="20000"
disableUploadTimeout="true"/>
3、调整线程数量:通过应用程序的连接器(Connector)进行性能控制的参数是创建处理请求的线程数。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 :网络连接超时:单位是ms。设置为0表示永不超时,这样设置是不好的有很大隐患。通常我们会把它设置为30000毫秒。
minSpareThreadsTomcat :初始化时创建的线程数。
maxSpareThreads :一旦创建的线程超过这个数值,tomcat就会关闭不再需要的socket线程。
最好的方式是多设置几次并进行测试,观察响应时间和内存使用情况。在不同的机器、操作系统或虚拟机组合的情况下可能会不同,而且并不是所有人的web站点的流量都是一样的,因此没有一刀切的方案来确定线程数的值!
2、如何加大tomcat连接数
在 tomcat配置文件 server.xml 中的 配置中,和连接数相关的参数有:
minProcessors:最小的空闲链接线程数,用于提高系统处理性能,默认值为10;
maxProcessors:最大的线程数,即:并发处理的最大请求数,默认是75;
acceptCount:允许最大的连接数,应该大于maxProcessors,默认为100
enableLookups: 是否反查域名,取值为true或者false。为了提高处理性能,应该设置为false;
connectionTimeout:网络链接超时时间,单位:毫秒。设置为0表示用不超时,通常设置为30000毫秒。其中和最大连接数相关的参数为maxProcessors和acceptCount,如果要加大并发连接数,应同时加大这两个参数。
tomcat5 中的配置示例:
<Connectorport="8080"
maxThreads="150"minSpareThreads="25"maxSpareThreads="75"
enableLookups="false"redirectPort="8443"acceptCount="100"
debug="0"connectionTimeout="20000"
disableUploadTimeout="true"/>
以此类推
3、怎样加大tomcat的内存
首先检查程序有没有陷入死循环,这个问题主要还是由于 java.lang.OutOfMemoryError:Java heap space(OOM)引起的。第一次出现这样的问题以后,引发了其他的问题。可能是堆栈设置的太小的原因。
根据网上的答案大致有两种解决方法:
1、设置环境变量
手动设置Heap size,修改TOMCAT_HOME/bin/catalina.sh set JAVA_OPTS=-Xms32m-Xmx512m,可以根据自己机器内存进行更改。
2、java-Xms32m-Xmx800m className
就是在执行java类文件时候加上这个参数,其中className是需要执行的全类名。而且执行的速度比没有设置的时候快很多。如果在测试的时候可能会用idea,就在启动的参数设置VM arguments中输入-Xms32m-Xmx800m这个参数就可以了。
一、java.lang.OutOfMemoryError:PermGen space PermGen space 的全称是 Permanent Generation space,是指内存的永久保存区域,这块内存中主要是被JVM存放CLass和Meta信息的,Class被Loader时就会放到PermGen space中,他和存放类实例(Instance)的Heap不同,GC(Garbage Collection)不会在主程序运行期间对PermGen space进行清理,所以如果你的应用中有很多class就很可能出现 PermGen space 错误。这种错误常见在web服务器对JSP进行precompile(预编译)的时候,如果你的web app下使用了大量的第三方的jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。解决方法: 手动设置MaxPermSize大小,修改TOMCAT_HOME/bin/catalina.sh,在“echo"Using CATALINA_BASE:$CATALINA_BASE"” 上面加一行:JAVA_OPTS="-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。可以利用jvm提供的 -Xmn-Xms-Xmx等选项可进行设置。Heap size的大小是 Young Generation和TenuredGeneraion只和
提示:在JVM中如果98%的时间是用于GC且可用的Heap Size不足2%的时候将抛出此异常信息。HeapSize 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx设置为相同,而-Xmn(年轻代大小)设置为-Xmx的1/4。
4、tomcat如何禁止列目录下的文件
在{tomcat_home}/conf/web.xml中,把listing参数设置为false即可,如下:
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
5、tomcat有几种部署方式
tomct中四种部署项目的方法
第一种:在tomcat中conf目录中,在server.xml中的host节点添加
<Context path="/hello"
docBase="D:/eclipse3.2.2/forwebtoolsworkspacehello/WebRoot"deb
ug="0"
privileged="true">
</Context>
至于Context节点属性,可以查阅 相关文档
第二种:将web项目文件拷贝到webapps目录中。
第三种:在conf目录中新建Catalina(注意大小写)\localhost目录,在该目录下新建一个xml文件,名字随意,只要不重复就行。该xml文件内容为:
<Context path="/hello"docBase="D:eclipse3.2.2forwebtoolsworksp
aceheloWebRoot"
debug="0"privileged="true">
</Context>
这种方法有个优点,可以定义别名。服务器端运行的项目名称为path,外部访问的URL则使用xml的文件名。这个方法很方便的隐藏了项目的名称,对一些项目名称被固定不能更换,但外部访问时又想换个路径的情况非常有效。第二、三种方法还有个优点,可以定义一些个性化配置,比如数据源配置等。
第四种:可以利用tomcat在线后台管理器,一般tomcat都打开了,直接上传war包就可以了
6、tomcat的优化经验
Tomcat作为web服务器,他的处理性直接关系到用户的体验,下面是常见的tomcat的优化常见措施:
去掉对web.xml的监视,把jsp提前编译成servlet。有富余物理内存的情况,加大tomcat使用jvm的内存。
提高服务器资源。服务器所能提供cpu,内存,硬盘的性能对处理能力有决定性影响。
对于高并发情况下会有大量的计算,那么cpu的速度会直接影响处理的速度。
内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用-Xmx,-Xms-,XX:MaxPermSize等参数对内存不同的模块进行划分。我们之前就遇到过内存不足的情况,导致虚拟机一直处于full gc,从而导致处理能力严重下降。
硬盘主要的问题就是读写性能,当大量的文件进行读写的时候,磁盘极容易成为性能的瓶颈。最好的办法是利用下面提到的缓存。
利用缓存和压缩。对于静态页面最好的办法是能够缓存起来,这样就不必每次从磁盘上读取。这里我们采用Nginx作为缓存服务器,将图片,css,js文件都进行了缓存,有效减少了后端tomcat的访问。另外,为了加快网络的传输速度,开启gzip压缩也是必不可少的。但是考虑到tomcat已经需要处理很多东西了,所以把这个处理工作就交给前端Nginx来完成。除了文本可以用gzip压缩,其实很多图片也可以用图像处理工具预先进行压缩,找到一个平衡点可以让画质损失很小而文件可以减少很多。曾经我就见过一个图片从300多k压缩到几十kb,自己几乎看不出来区别。(你是一个认真的人,只要坚持努力将来一定会成功的!)
采用集群。单个服务器的性能总是有限的,最好的办法自然是横向扩展。我们还是采用Nginx来作为请求分流的服务器,后端多个tomcat共享session来协同工作。
优化tomcat参数。这里我用tomcat7的参数配置为例,需要修改server.xml,主要优化连接配置,关闭客户端dns查询。
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="20"
acceptCount="100"
disableUploadTimeout="true"
enableLookups="false"
URIEncoding="UTF-8"/>
2、JVM性能优化专题
3、MysSQL数据库性能优化专题
二、微服务架构面试专题
1、SpringBoot面试整理
2、SpringCloud面试整理
3、Dubbo面试题整理
三、并发编程面试专题
1、你用过Synchronized吗?知道Synchronized原理吗?
2、你获取到的“锁”,它到底是什么?如何确定对象的锁?
3、什么是锁的可重入性,为什么说Synchronized是可重入锁呢?
4、JVM对Java中的原生锁做了哪些优化?
5、为什么说Synchronized是非公平的锁呢?
6、什么是锁小升初和锁粗化?
7、为什么说Synchronized是一个悲观锁?乐观锁的实现原理又是什么?什么是CAS?
8、乐观锁一定就是好的吗?
9、跟Synchronized相比,可重入锁ReentrantLock的实现原理有什么不同呢?
10、请谈谈AQS框架是怎么回事儿?
11、对比Synchronized和ReentrantLock的异同
12、ReentrantLock是怎么实现可重入性的?
13、除了ReentrantLock,你还接触过JUC中哪些并发工具?
14、请谈谈ReadWriteLock和StampedLock(1.8)的区别有哪些?
15、如何让java的线程彼此同步?你了解过哪些同步器?请分别介绍下。
四、开源框架面试专题
转载:https://blog.csdn.net/AntdonYu/article/details/115915371