2023年企業(yè)Java面試題精選
前言:因?yàn)槲臋n為pdf格式,轉(zhuǎn)化后可能出現(xiàn)錯(cuò)字或亂碼,
內(nèi)容過(guò)多大家可能也不能一直停留在這個(gè)界面,我直接無(wú)償分享給大家
獲取方法:
關(guān)注后,后臺(tái)私信白嫖就可以了.


正片開(kāi)始!
目錄
一、性能優(yōu)化面試專欄
1.1、tomcat性能優(yōu)化整理
1.2、JVM性能優(yōu)化整理
1.3、MysqI性能優(yōu)化整理
二-、微服務(wù)架構(gòu)面試專欄
2.1、SpringCloud面試整理
2.2、SpringBoot面試整理
2.3、Dubbo面試整理
三、并發(fā)編程高級(jí)面試專欄
四、開(kāi)源框架面試題專欄
4.1、Spring面試整理
4.2、SpringMVC面試整理
4.3、MyBatis面試整理
五、分布式面試專欄
5.1、分布式限流面試整理
5.2、分布式通訊面試整理
5.3、分布式數(shù)據(jù)庫(kù)面試整理

一、性能優(yōu)化專欄
1.1、 tomcat性能優(yōu)化整理
1、你怎樣給tomcat調(diào)優(yōu)
1. JVM參數(shù)調(diào)優(yōu): -Xms<s ize>表示JVM初始化堆的大小,-????
Xmx<size>表示JVM堆的最大值。這兩個(gè)值的大小一般根據(jù)需要進(jìn)行設(shè)
置。當(dāng)應(yīng)用程序需要的內(nèi)存超出堆的最大值時(shí)虛擬機(jī)就會(huì)提示內(nèi)存溢出,
并且導(dǎo)致應(yīng)用服務(wù)崩潰。因此一般建議堆的最大值設(shè)置為可用內(nèi)存的最大
值的80%。在catalina.bat 中,設(shè)置JAVA _OPTS= '-Xms256m-
Xmx512m',表示初始化內(nèi)存為256MB, 可以使用的最大內(nèi)存為512MB。
2.禁用DNS查詢
當(dāng)web應(yīng)用程序向要記錄客戶端的信息時(shí),它也會(huì)記錄客戶端的IP地址或
者通過(guò)域名服務(wù)器查找機(jī)器名轉(zhuǎn)換為IP地址。DNS查詢需要占用網(wǎng)絡(luò),并
且包括可能從很多很遠(yuǎn)的服務(wù)器或者不起作用的服務(wù)器上去獲取對(duì)應(yīng)的IP
的過(guò)程,這樣會(huì)消耗-定的時(shí)間。 為了消除DNS查詢對(duì)性能的影響我們可
以關(guān)閉DNS查詢,方式是修改| server . xml文件中的enableLookups 參數(shù)值

3.調(diào)整線程數(shù)
通過(guò)應(yīng)用程序的連接器(Con nector)進(jìn)行 性能控制的的參數(shù)是創(chuàng)建的
處理請(qǐng)求的線程數(shù)。Tomcat 使用線程池加速響應(yīng)速度來(lái)處理請(qǐng)求。在
Java中線程是程序運(yùn)行時(shí)的路徑,是在一個(gè)程序中與其它控制線程無(wú)關(guān)
的、能夠獨(dú)立運(yùn)行的代碼段。它們共享相同的地址空間。多線程幫助程序
員寫(xiě)出CPU最大利用率的高效程序,使空閑時(shí)間保持最低,從而接更多的
請(qǐng)求。
| Tomcat4中可以通過(guò)修改minProcessors和maxProcessors的值來(lái)控
制線程數(shù)。這些值在安裝后就已經(jīng)設(shè)定為默認(rèn)值并且是足夠使用的,但是
隨著站點(diǎn)的擴(kuò)容而改大這些值。minProcessors 服務(wù)器啟動(dòng)時(shí)創(chuàng)建的處
理請(qǐng)求的線程數(shù)應(yīng)該足夠處理一個(gè)小量的負(fù)載。也就是說(shuō),如果-天內(nèi)每
秒僅發(fā)生5次單擊事件,并且每個(gè)請(qǐng)求任務(wù)處理需要1秒鐘,那么預(yù)先設(shè)置
線程數(shù)為5就足夠了。但在你的站點(diǎn)訪問(wèn)量較大時(shí)就需要設(shè)置更大的線程
數(shù),指定為參數(shù)maxProcessors的值。maxProcessors 的值也是有上
限的,應(yīng)防止流量不可控制(或者惡意的服務(wù)攻擊),從而導(dǎo)致超出了虛
擬機(jī)使用內(nèi)存的大小。如果要加大并發(fā)連接數(shù),應(yīng)同時(shí)加大這兩個(gè)參
數(shù)。web server允許的最大連接數(shù)還受制于操作系統(tǒng)的內(nèi)核參數(shù)設(shè)置,
通常Windows是2000個(gè)左右,Linux是1000個(gè)左右 。
在Tomcat5對(duì)這些參數(shù)進(jìn)行了調(diào)整,請(qǐng)看下面屬性:
maxThreads Tomcat使用線程來(lái)處理接收的每個(gè)請(qǐng)求。這個(gè)值表示
Tomcat可創(chuàng)建的最大的線程數(shù)。
| acceptCount指定當(dāng)所有可以使用的處理請(qǐng)求的線程數(shù)都被使用時(shí),可
以放到處理隊(duì)列中的請(qǐng)求數(shù),超過(guò)這個(gè)數(shù)的請(qǐng)求將不予處理。
| connnection Timeout網(wǎng)絡(luò)連接超時(shí),單位:毫秒。設(shè)置為0表示永不
超時(shí),這樣設(shè)置有隱患的。通??稍O(shè)置為30000毫秒。
minSpareThreadsTomcat初始化時(shí)創(chuàng)建的線程數(shù)。
maxSpareThreads -旦創(chuàng)建的線程超過(guò)這個(gè)值,| Tomcat 就會(huì)關(guān)閉不再
需要的socket線程。
最好的方式是多設(shè)置幾次并且進(jìn)行測(cè)試,觀察響應(yīng)時(shí)間和內(nèi)存使用情況。
在不同的機(jī)器、操作系統(tǒng)或虛擬機(jī)組合的情況下可能會(huì)不同,而且并不是
所有人的web站點(diǎn)的流量都是-樣的,因此沒(méi)有-刀切的方案來(lái)確定線程
數(shù)的值。
2、如何加大comcat連接數(shù)
在tomcat配置文件server . xml中的<Connector/>
配置中,和連接數(shù)相關(guān)的參數(shù)有:
minProcessors |:最小空閑連接線程數(shù),用于提高系統(tǒng)處理性能,默認(rèn)
值為10
maxProcessors:最大連接線程數(shù),即:并發(fā)處理的最大請(qǐng)求數(shù),默認(rèn)
值為75
| acceptCount :允許的最大連接數(shù),應(yīng)大于等于maxProcessors,默
認(rèn)值為100
| enableLookups: 是否反查域名,取值為: true或false。 為了提高處理能
力,應(yīng)設(shè)置為false
| connect ionTimeout |: 網(wǎng)絡(luò)連接超時(shí),單位:毫秒。設(shè)置為0表示永不
超時(shí),這樣設(shè)置有隱患的。通??稍O(shè)置為30000毫秒。
其中和最大連接數(shù)相關(guān)的參數(shù)為maxProcessors和acceptCount。如果要加
大并發(fā)連接數(shù),應(yīng)同時(shí)加大這兩個(gè)參數(shù)。
web server 允許的最大連接數(shù)還受制于操作系統(tǒng)的內(nèi)核參數(shù)設(shè)置,通常
Windows是2000個(gè)左右,Linux是 1000個(gè)左右。tomcat5中的配置示例:

對(duì)于其他端口的偵聽(tīng)配置,以此類推。
3、怎樣加大tomcat的內(nèi)存
首先檢查程序有沒(méi)有限入死循環(huán)
這個(gè)問(wèn)題主要還是由這個(gè)問(wèn)題java. lang. OutOfMemoryError:Java
heap space
引起的。第一次出現(xiàn)這樣的的問(wèn)題以后,引發(fā)了其他的問(wèn)題。在網(wǎng)上一查
可能是JAVA的堆棧設(shè)置太小的原因。
跟據(jù)網(wǎng).上的答案大致有這兩種解決方法:
1、設(shè)置環(huán)境變量
解決方法:手動(dòng)設(shè)置Heap size
修改TOMCAT_ HOME/bin/catalina. sh
setJAVA_ _OPTS= -Xms32m- -Xmx512m
可以根據(jù)自己機(jī)器的內(nèi)存進(jìn)行更改。
2、java- -Xms32m- -Xmx800m className
就是在執(zhí)行JAVA類文件時(shí)加上這個(gè)參數(shù),其中className
是需要執(zhí)行的確類名。(包括包名) 這個(gè)解決問(wèn)題了。而且執(zhí)行的速度比
沒(méi)有設(shè)置的時(shí)候快很多。如果在測(cè)試的時(shí)候可能會(huì)用Eclispe這時(shí)候就需要
在Eclipse ->run- arguments中的M arguments 中輸入| -Xms32m-
Xmx80m這個(gè)參數(shù)就可以了。
后來(lái)在Eclilpse中修改了啟動(dòng)參數(shù),在VMarguments
加入了-Xms32m- -Xmx800m,問(wèn)題解決。
一、java. lang . OutOfMemoryError:PermGen space
PermGen space 的全稱是Pe rmanent Generation space ,是指內(nèi)存的
永久保存區(qū)域,
這塊內(nèi)存主要是被JVM存放Class和Meta信息的,Class在被L oader時(shí)就會(huì)被
放到PermGen space 中,它和存放類實(shí)例(Instance)的Heap區(qū)域不
同,GC(Garbage Collection) 不會(huì)在主程序運(yùn)行期對(duì)PermGen space
進(jìn)行清理,所以如果你的應(yīng)用中有很多CL ASS的話,
就很可能出現(xiàn)PermGen space 錯(cuò)誤,這種錯(cuò)誤常見(jiàn)在web服務(wù)器對(duì)JSP進(jìn)
行preco mpile的時(shí)候。如果你的WEB APP下都用了大量的第三方j(luò)ar,
其大小超過(guò)了jvm默認(rèn)的大小(4M)那么就會(huì)產(chǎn)生此錯(cuò)誤信息了。
解決方法:手動(dòng)設(shè)置MaxPermSize大小修
改TOMCAT HOME/bin/catalina.sh
在"echo"Using CATALINA_ BASE: $CATALINA_ BASE"". 上面加入以下
行: JAVA _0PTS="-server- XX: PermSize=64M- XX:MaxPermSize=128m
建議:將相同的第三方j(luò)ar文件移置到tomcat/shared/lib目錄下,這樣
可以達(dá)到減少jar文檔重復(fù)占用內(nèi)存的目的。
二、java. lang. OutOfMemoryError:Java heap space
Heap size設(shè)置
JVM堆的設(shè)置是指java程序運(yùn)行過(guò)程中JVM可以調(diào)配使用的內(nèi)存空間的設(shè)
置.JVM在啟動(dòng)的時(shí)候會(huì)自動(dòng)設(shè)置Heap size 的值,
其初始空間(即-Xms)是物理內(nèi)存的1/64,最大空間| (-Xmx) 是物理內(nèi)存
的1/4??梢岳肑MM提供的-Xmn -Xms -Xmx 等選項(xiàng)可進(jìn)行設(shè)置。Heap
size的大小是Young Generat ion和TenuredGeneraion
之和。
提示:在JVM中如果98%的時(shí)間是用于GC且可用的Heap size 不足2%
的時(shí)候?qū)伋龃水惓P畔ⅰ?/p>
提示: Heap Size 最大不要超過(guò)可用物理內(nèi)存的80%,-般的要將一
Xms和I-Xmx選項(xiàng)設(shè)置為相同,而-Xmn為1/4的-Xmx值。
解決方法:手動(dòng)設(shè)置Heap size
修改TOMCAT_ HOME/bin/catalina. sh
在"echo"Us ing CATALINA_ BASE:$CATALINA BASE""上面加入以下行:
| JAVA_ 0PTS="-server-Xms800m- -Xmx800m- Xx:MaxNewSize=256m"
三、實(shí)例,以下給出1G內(nèi)存環(huán)境下java jvm的參數(shù)設(shè)置參考:?
JAVA_ OPTS="-server- -Xms800m- -Xmx800m- XX: PermSize=64M-
XX:MaxNewSize=256m- -XX:MaxPermSize=128m-
Dj ava . awt . headless=true"
很大的web工程,用tomcat默認(rèn)分 配的內(nèi)存空間無(wú)法啟動(dòng),如果不是在
myeclipse中啟動(dòng)tomcat可以對(duì)tomcat
這樣設(shè)置:
| 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中啟動(dòng),上述的修改就不起作用了, 可如下設(shè)置:
Myeclipse- >preferences->myeclipse- >servers->tomcat-
>tomcatx.x->JDK面板中的Opt ional Java VM arguments 中添加:日
Xmx1024M- Xms512M- -XX:MaxPermSize=256m
以上是轉(zhuǎn)貼,但本人遇見(jiàn)的問(wèn)題是:在myeclipse中啟動(dòng)Tomcat時(shí), 提
示"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參 數(shù)設(shè)置成false即可,
如下:

5、Tomcat有 幾種部署方式
tomcat中四種部署項(xiàng)目方法
第一種方法:
在tomcat中的conf目錄中,在server . xml中的,,<host/> 節(jié)點(diǎn)中
添加:


至于Context節(jié)點(diǎn)屬性,可詳細(xì)見(jiàn)相關(guān)文檔。
第二種方法:
將web項(xiàng)目文件件拷貝到webapps目錄中。
第三種方法:
很靈活,在conf目錄中,新建Catalina (注意大小寫(xiě))
\| localhost目錄,在該目錄中新建一個(gè)xml文件,名字可以隨意取,
只要和當(dāng)前文件中的文件名不重復(fù)就行了,該xml文件的內(nèi)容為:

第3個(gè)方法有個(gè)優(yōu)點(diǎn),可以定義別名。服務(wù)器端運(yùn)行的項(xiàng)目名稱
為path,外部訪問(wèn)的URL 則使用XML 的文件名。這個(gè)方法很方便的隱
藏了項(xiàng)目的名稱,對(duì)一些項(xiàng)目名稱被固定不能更換,但外部訪問(wèn)時(shí)又想換
個(gè)路徑,非常有效。
第2、3還有優(yōu)點(diǎn),可以定義一些個(gè)性配置,如數(shù)據(jù)源的配置等。
第四種辦法:
可以用tomcat 在線后臺(tái)管理器,一般tomcat都打開(kāi)了,直接上傳war
就可以
6. Tomcat的優(yōu)化經(jīng)驗(yàn)
| Tomcat作為web服務(wù)器,它的處理性能直接關(guān)系到用戶體驗(yàn), 下面是種
常見(jiàn)的優(yōu)化措施:
●去掉對(duì)web.xml的監(jiān)視,把jsp提前編輯成Servlet。有富余物理內(nèi)
存的情況,加大tomcat使用的jvm 的內(nèi)存。
●服務(wù)器資源
服務(wù)器所能提供CPU、內(nèi)存、硬盤(pán)的性能對(duì)處理能力有決定性影響。
●對(duì)于高并發(fā)情況下會(huì)有大量的運(yùn)算,那么CPU的速度會(huì)直接影響到處理
速度。
,內(nèi)存在大量數(shù)據(jù)處理的情況下,將會(huì)有較大的內(nèi)存容量需求,可以用
-Xmx -Xms- XX:MaxPermSize等參數(shù)對(duì)內(nèi)存不同功能塊進(jìn)行劃分。我們之
前就遇到過(guò)內(nèi)存分配不足,導(dǎo)致虛擬機(jī)-直處于full GC,從而導(dǎo)致處
理能力嚴(yán)重下降。
●硬盤(pán)主要問(wèn)題就是讀寫(xiě)性能,當(dāng)大量文件進(jìn)行讀寫(xiě)時(shí),磁盤(pán)極容易成為
性能瓶頸。最好的辦法還是利用下面提到的緩存。
●利用緩存和壓縮
對(duì)于靜態(tài)頁(yè)面最好是能夠緩存起來(lái),這樣就不必每次從磁盤(pán)上讀。這里我
們采用了Nginx作為緩存服務(wù)器,將圖片、css、 js文件都進(jìn)行了緩存,有
效的減少了后端tomcat的訪問(wèn)。另外,為了能加快網(wǎng)絡(luò)傳輸速度,開(kāi)啟
gzip壓縮也是必不可少的。但考慮到tomcat已經(jīng)需要處理很多東西了,所
以把這個(gè)壓縮的工作就交給前端的Nginx來(lái)完成。
除了文本可以用gzip壓縮,其實(shí)很多圖片也可以用圖像處理工具預(yù)先進(jìn)行
壓縮,找到一個(gè)平衡點(diǎn)可以讓畫(huà)質(zhì)損失很小而文件可以減小很多。曾經(jīng)我
就見(jiàn)過(guò)-個(gè)圖片從300多kb壓縮到幾十kb,自己幾乎看不出來(lái)區(qū)別。
●采用集群
單個(gè)服務(wù)器性能總是有限的,最好的辦法自然是實(shí)現(xiàn)橫向擴(kuò)展,那么組建
tomcat集群是有效提升性能的手段。我們還是采用了Nginx來(lái)作為請(qǐng)求分
流的服務(wù)器,后端多個(gè)tomcat共享session來(lái)協(xié)同工作??梢詤⒖贾皩?xiě)的
《利用nginx+tomcat+memcached組建web服務(wù)器負(fù)載均衡》。
●優(yōu)化tomcat參數(shù)
這里以tomcat7的參數(shù)配置為例,需要修改conf/serve.xmlI文件,主要是優(yōu)
化連接配置,關(guān)閉客戶端dns查詢。


1.2、JVM性能優(yōu)化專題
1. Java類加載過(guò)程
Java類加載需要經(jīng)歷一下7個(gè)過(guò)程:
1.加載
加載是類加載的第一個(gè)過(guò)程, 在這個(gè)階段,將完成一下三件 事情:
●通過(guò)一個(gè)類的全限定名獲取該類的二進(jìn)制流。
●將該二進(jìn)制流中的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法去運(yùn)行時(shí)數(shù)據(jù)結(jié)
構(gòu)。
●在內(nèi)存中生成該類的Class對(duì)象,作為該類的數(shù)據(jù)訪問(wèn)入口。
2.驗(yàn)證
驗(yàn)證的目的是為了確保Class文件的字節(jié)流中的信息不回危害到
虛擬機(jī).在該階段主要完成以下四鐘驗(yàn)證:
●文件格式驗(yàn)證:驗(yàn)證字節(jié)流是否符合Class文件的規(guī)范,如主次版本號(hào)
是否在當(dāng)前虛擬機(jī)范圍內(nèi),常量池中的常量是否有不被支持的類型.
●元數(shù)據(jù)驗(yàn)證:對(duì)字節(jié)碼描述的信息進(jìn)行語(yǔ)義分析,如這個(gè)類是否有父類,
是否集成了不被繼承的類等。
●字節(jié)碼驗(yàn)證:是整個(gè)驗(yàn)證過(guò)程中最復(fù)雜的一個(gè)階段,通過(guò)驗(yàn)證數(shù)據(jù)流和
控制流的分析,確定程序語(yǔ)義是否正確,主要針對(duì)方法體的驗(yàn)證。如:方
法中的類型轉(zhuǎn)換是否正確,跳轉(zhuǎn)指令是否正確等。
●符號(hào)引用驗(yàn)證:這個(gè)動(dòng)作在后面的解析過(guò)程中發(fā)生,主要是為了確保解
析動(dòng)作能正確執(zhí)行。
3.準(zhǔn)備
準(zhǔn)備階段是為類的靜態(tài)變量分配內(nèi)存并將其初始化為默認(rèn)值,這些內(nèi)存都
將在方法區(qū)中進(jìn)行分配。準(zhǔn)備階段不分配類中的實(shí)例變量的內(nèi)存,實(shí)例變
量將會(huì)在對(duì)象實(shí)例化時(shí)隨著對(duì)象-起分 配在Java堆中。

內(nèi)容過(guò)多大家可能也不能一直停留在這個(gè)界面,我直接無(wú)償分享給大家
獲取方法:
關(guān)注后,后臺(tái)私信白嫖就可以了.