1.sql中有select乖订,from,where夺巩,group by贞让,order by,having請問sql執(zhí)行時的順序是怎樣的柳譬?答:前面從from(表)where(按條件取出數(shù)據(jù))group by(再對取出的數(shù)據(jù)分組)having(分組后再過濾得到最新數(shù)據(jù)集)select(按照設(shè)置列從數(shù)據(jù)集里面去除數(shù)據(jù))order by(對取出的數(shù)據(jù)進行排序)執(zhí)行順序:from--where--group by--having--select--order by
2.mybatis中resultMap和resultType的區(qū)別震桶?答:resultMap更強大一些,可自定義字段為別名(column: 庫表的? 字段名征绎,property: 實體類里的屬性名 );一對多的情況時使用resultMapresultType是實體類和數(shù)據(jù)庫表字段一一對應(yīng)磨取,直接返回類型人柿。二者不可同時存在
3.hashMap和hashTable有哪些區(qū)別?答:hashMap(jdk1.8采用 數(shù)組+鏈表+紅黑樹忙厌,鏈表閾值長度超過8轉(zhuǎn)為紅黑樹):1.key-value存儲凫岖,單鏈表超出閾值自增;2.線程不安全逢净,適用于單線程(多線程下可能會產(chǎn)生死鎖)哥放,多線程建議使用concurrent并發(fā)包下的concurrentHashMap(分段鎖)歼指;3.可以有一個null的key,可以有多個null的value甥雕;(使用containsKey()方法進行判斷是否存在某個鍵)4.效率高hashTable:1.key-value存儲踩身,單鏈表超出閾值自增;2.線程安全社露,適用于多線程挟阻,因為hashTable每個方法都加了Synchronize;3.key不可為null峭弟,value不可為null附鸽;4.效率低
4.Bean的生命周期?答:1.實例化bean對象(通過構(gòu)造方法或工廠方法)2.設(shè)置對象屬性(setter瞒瘸,依賴注入等)3.如果Bean實現(xiàn)了BeanNameWare接口坷备,工廠調(diào)用Bean的setBeanName()方法傳遞Bean的id。(和下面一條均屬于檢查Ware接口)4.如果Bean實現(xiàn)了BeanFactoryAware接口情臭,工廠調(diào)用BeanFactoryAware()方法傳入工程自身5.將Bean實例傳遞給Bean的前置處理器postProcessBeforeInitialization(Object bean, String beanName)方法6.調(diào)用Bean的初始化方法7.將Bean實例傳遞給Bean的后置處理器postProcessAfterInitialization(Object bean, String beanName)方法8.使用Bean9.容器關(guān)閉之前省撑,調(diào)用Bean的銷毀方法;(簡單描述:實例化--設(shè)置屬性--檢查ware接口--初始化--使用--銷毀)
5.事務(wù)的四大特征谎柄?臟讀丁侄,幻讀,不可重復(fù)讀朝巫?答:1.(Atomicity)原子性:要么全成功鸿摇,要么全失敗2.(Isolation)隔離性:多個并發(fā)事務(wù)互不影響3.(Consistency)一致性:事務(wù)前后數(shù)據(jù)的完整性始終保持一致4.(Durability)持久性:當事務(wù)完成后,數(shù)據(jù)庫的改變是永久的5.臟讀:讀取未提交數(shù)據(jù)6.幻讀:前后多次讀取劈猿,數(shù)據(jù)總量不一致7.不可重復(fù)讀:前后多次讀取拙吉,數(shù)據(jù)內(nèi)容不一致
6.跨域怎么解決?當前端頁面與后臺運行在不同的服務(wù)器時揪荣,就必定會出現(xiàn)跨域這一問題筷黔。所謂同源策略是指,域名仗颈,協(xié)議佛舱,端口均相同;不同源則產(chǎn)生跨域挨决。答:1.使用ajax的jsonp请祖,該方式只適用于GET請求2.使用negix的反向代理3.使用Cros(在后臺控制層加上:@CrossOrigin(origins = "*", maxAge = 3600)//origins? : 允許可訪問的域列表,"*"代表所有脖祈;maxAge:準備響應(yīng)前的緩存持續(xù)的最大時間(以秒為單位)肆捕。)
7.IOC和AOP可以說一下嘛?答:IOC控制反轉(zhuǎn):將創(chuàng)建對象的權(quán)利交給核心容器(由容器來負責(zé)對象的生命周期和對象之間的關(guān)系)盖高。IOC主要實現(xiàn)方式有兩種:依賴注入和控制反轉(zhuǎn)(DI:就是IOC容器把當前對象所需要的外部資源動態(tài)注入給我們慎陵;四種注入方式:注解注入眼虱,set注入,構(gòu)造器注入席纽,靜態(tài)工廠注入)----當某個角色 需要另外一個角色協(xié)助的時候捏悬,在傳統(tǒng)的程序設(shè)計過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例胆筒。但在spring中 創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成邮破,因此稱為控制反轉(zhuǎn)。創(chuàng)建被調(diào)用者的工作由spring來完成仆救,然后注入調(diào)用者 因此也稱為依賴注入抒和。 AOP面向切面編程:可以說是OOP的補充和完善,OOP引入封裝彤蔽、繼承和多態(tài)性等概念來建立一種對象層次結(jié)構(gòu)摧莽。實現(xiàn)AOP的技術(shù),主要分為兩大類:一是采用動態(tài)代理技術(shù)顿痪,二是采用靜態(tài)織入的方式镊辕。----這玩意我舉個例子說下,比如你寫了個方法用來做一些事情蚁袭,但這個事情要求登錄用戶才能做征懈,你就可以在這個方法執(zhí)行前驗證一下,執(zhí)行后記錄下操作日志揩悄,把前后的這些與業(yè)務(wù)邏輯無關(guān)的代碼抽取出來放一個類里卖哎,這個類就是切面(Aspect),這個被環(huán)繞的方法就是切點(Pointcut)删性,你所做的執(zhí)行前執(zhí)行后的這些方法統(tǒng)一叫做增強處理(Advice)亏娜。
8.過濾器和攔截器的區(qū)別簡單說一下
答:過濾器:通俗的說過濾器就是篩選出你想要的東西(就是一堆請求過來時,過濾掉一些不合法的請求)蹬挺,比如request中你想要的那部分维贺,依賴于servlet容器。(應(yīng)用場景:URL級別的權(quán)限訪問控制巴帮;過濾敏感詞匯(防止sql注入)溯泣;設(shè)置字符編碼)springboot自定義過濾器實現(xiàn)步驟:1.利用@WebFilter創(chuàng)建Filter過濾器類;2.Application啟動類添加@ServletComponentScan注解攔截器:攔截器榕茧,請求的接口被訪問之前发乔,進行攔截然后在之前或之后加入某些操作。攔截是AOP的一種實現(xiàn)策略(底層是動態(tài)代理-反射)雪猪。 攔截器主要用來按照指定規(guī)則拒絕請求。在做安全方便用的比較多起愈,比如終止一些流程等(應(yīng)用場景:Token令牌驗證只恨;請求數(shù)據(jù)校驗译仗;用戶權(quán)限校驗;放行指定接口官觅;攔截未登錄用戶)纵菌。springboot自定義攔截器實現(xiàn)只需兩步:1.自定義攔截器,實現(xiàn)HandlerInterceptor這個接口休涤;2.注冊攔截器咱圆。從靈活性上說攔截器功能更強大些,F(xiàn)ilter能做的事情功氨,他都能做序苏;
9.HashMap組成原理和底層實現(xiàn)原理?答:在Java中最基本的數(shù)據(jù)結(jié)構(gòu)有兩種捷凄,數(shù)組和鏈表數(shù)組:查詢快忱详,根據(jù)索引查詢,添加和刪除比較困難跺涤;鏈表:查詢慢匈睁,需要遍歷整個鏈表,添加和刪除容易桶错;HashMap是由數(shù)組加鏈表組成航唆,數(shù)據(jù)結(jié)構(gòu)中又叫 “鏈表散列”紅黑樹(jdk1.8):一種二叉樹,高效的檢索效率當鏈表達到一定長度后院刁,鏈表就會變成紅黑樹(A下面有兩個節(jié)點BC糯钙,B和C下面又有DEF)HashMap的特點:1.快速存儲:比如當我們對hashmap進行g(shù)et和put的時候速度非常快黎比;
2.快速查找:當我們通過key去get一個value的時候時間復(fù)雜度非常的低超营,效率非常高;
3.可伸縮:1數(shù)組擴容阅虫,邊長演闭。2,單線列表如果長度超過8的話會變成紅黑樹颓帝。
10.微服務(wù)架構(gòu)有了解嗎米碰?(比如springCloud)答:(可以說一下springCloud的五大組件,把你知道的都說出來)Eureka:服務(wù)注冊中心(類似注冊中心還有Consul购城,了解哪一種就描述哪一種)Ribbon:本地負載均衡(Feign:服務(wù)與服務(wù)間遠程調(diào)用)Zuul/Gateway:服務(wù)網(wǎng)關(guān)(類似Nginx反相代理的功能吕座;Gateway是基于Springboot2.0,取代Zuul)Hystrix:斷路器Spring Cloud Config:分布式配置(目前還是靜態(tài)的瘪板,需要配合Spring Cloud Bus來實現(xiàn)動態(tài)的配置更新)
12.微服務(wù)動態(tài)配置有幾種實現(xiàn)方式吴趴?答:1.使用Consul做注冊中心,(微服務(wù)配置做在線配置統(tǒng)一管理侮攀,也可實現(xiàn)動態(tài)配置加載)锣枝;2.攜程的Apollo(推薦使用厢拭,配置修改實時生效(熱發(fā)布));3.springCloud全家桶自帶的config(聽說不是很好用撇叁,目前項目中還未用到)供鸠;4.阿里的 Nacos(即可做服務(wù)注冊中心,也可做配置中心陨闹,聽朋友說好用)
13.mysql優(yōu)化常用到的幾種方式楞捂,簡單說一下?答:mysql優(yōu)化主要分為以下四大方面:1.設(shè)計:存儲引擎趋厉,字段類型寨闹,范式與逆范式,減少訪問數(shù)據(jù)庫的次數(shù)
2.功能:索引觅廓,緩存鼻忠,分區(qū)分表。
3.架構(gòu):主從復(fù)制杈绸,讀寫分離帖蔓,負載均衡。
4.合理SQL:合理使用join瞳脓,盡量不要使用select *塑娇,in,not in ,or劫侧。
14.spring和springboot的區(qū)別(優(yōu)缺點)答:springboot基本上是spring框架的一個擴展埋酬,消除了spring的一些復(fù)雜配置
14.Redis用過嗎?答:用過烧栋,支持多種存儲類型写妥,五大基本類型說一下String(字符串):一個key對應(yīng)一個valueHash(哈希):類似java中Map 常用List(列表):字符串列表Set(集合):String類型的無序集合ZSet:不可重,有序集合說一個使用場景:手機號驗證碼登錄功能审姓,session共享珍特。
15.使用過什么中間件?答:RabbitMQ(消息隊列)
MyCat(分庫分表魔吐,讀寫分離)
Mybatis(持久層框架)
Swagger2(swagger-ui扎筒,Rest APIs文檔生成工具)
PageHelper(物理分頁插件)
16.請說一下Java中的NIO,BIO酬姆,AIO分別是什么嗜桌?答:BIO:同步阻塞式IO,簡單理解:一個連接一個線程辞色,BIO適用于連接數(shù)目比較小且固定的架構(gòu)骨宠,這種方式對服務(wù)器的資源要求比較高,并發(fā)局限于應(yīng)用中,jdk1.4以前唯一的選擇层亿,單程序直觀簡單易理解壶唤。NIO:同步非阻塞IO,簡單理解:一個請求一個線程棕所,NIO適合連接數(shù)目多且連接比較短(清操作)的架構(gòu),比如聊天服務(wù)器悯辙,并發(fā)局限于應(yīng)用中琳省,編程比較復(fù)雜,jdk1.4開始支持躲撰。AIO:異步非阻塞IO针贬,簡單理解:一個有效請求一個線程,AIO適用于連接數(shù)目多拢蛋,且連接比較長(重操作)的架構(gòu)桦他,比如相冊服務(wù)器,充分調(diào)用OS參與并發(fā)操作谆棱,編程比較復(fù)雜快压,jdk1.7開始支持。
17.說一下Spring的設(shè)計模式答:工廠模式:BeanFactory就是簡單工廠模式的體現(xiàn)垃瞧,用來創(chuàng)建對象的實例蔫劣;單例模式:Bean默認為單例模式;代理模式:Spring的AOP就是使用了JDK的動態(tài)代理和CGLIB字節(jié)碼生成技術(shù)个从;模版方法:用來解決重復(fù)代碼的問題脉幢,比如RedisTemplate, JpaTemplate嗦锐。觀察者模式:定義對象鍵一種一對多的依賴關(guān)系嫌松,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都會得到通知被制動更新奕污,如Spring中l(wèi)istener的實現(xiàn)–ApplicationListener萎羔。
18.用過那些前端框架?答:Bootstarp菊值;easyUI外驱;LayUIThymeleaf(springboot默認是不支持jsp的,默認使用的Thymeleaf模版引擎)
19.ThreadLocal有什么作用腻窒?答:waitingThreadLocal是創(chuàng)建線程的本地變量昵宇,一個對像的所有線程共享它的全部局變量,所以這些變量是非線程安全的儿子,我們可以使用同步技術(shù)瓦哎。但是我們不想使用同步技術(shù)的時候,可以選擇ThreadLocal變量。每個線程都會擁有他們自己的Thread變量蒋譬,他們可以使用get(),set()去獲取他們的默認值或者在線程內(nèi)部改變他們的值割岛。(說白了,ThreadLocal就是想在多線程下保證成員變量的安全)
20.多線程了解嗎犯助?答:可以從以下幾個方面作出回答:
創(chuàng)建多線程的四種方式:
1.繼承Thread類(缺點:Java只支持單繼承)
2.實現(xiàn)Runnable接口(可返回執(zhí)行結(jié)果癣漆,run()方法不可向外拋異常,只能內(nèi)部消化)
3.實現(xiàn)Callable接口(不返回執(zhí)行結(jié)果剂买,call()方法允許向外拋出異常)
4.通過線程池創(chuàng)建線程惠爽,Executors工具類是用來創(chuàng)建線程池的,可以指定線程也可以不指定瞬哼。
出現(xiàn)線程不安全的原因是什么婚肆?
答:如果我們創(chuàng)建多個線程,存在著共享數(shù)據(jù)坐慰,那么就有可能出現(xiàn)線程安全的問題:當其中一個線程操作共享數(shù)據(jù)時较性,還未操作完成,另外的線程就參與進來结胀,導(dǎo)致共享數(shù)據(jù)的操作出現(xiàn)問題赞咙。
線程不安全解決辦法?
要求一個線程操作共享數(shù)據(jù)時把跨,只有當其完成操作共享數(shù)據(jù)人弓,其他線程才會有機會執(zhí)行共享數(shù)據(jù)。Java提供了兩種方式來實現(xiàn)同步互斥訪問:synchronized和lock着逐。
多線程中wait()和sleep()的區(qū)別崔赌?
wait()會釋放當前持有的鎖,進行等待耸别,sleep()不會釋放鎖健芭;
wait()只能在同步代碼塊或同步方法內(nèi)使用,sleep()可以在任意地方進行使用秀姐;
wait() notify()只喚醒一個線程 notifyAll()喚醒所有線程? 不需要捕獲異常慈迈,sleep()需要捕獲異常;
推薦:由于sleep()不釋放鎖資源省有,容易導(dǎo)致死鎖問題痒留,而wait()不會,一般情況下推薦使用wait() 蠢沿。
21.Java線程池的實現(xiàn)原理伸头,主要方法ThreadPoolExecutor()答:線程池說白了就是一個線程集合workerSet和一個阻塞隊列workQueue,當用戶向線程池提交一個任務(wù)(也就是線程)時舷蟀,線程池會先將任務(wù)放入workQueue中恤磷,workerSet中的線程會不斷的從workQueue中獲取線程然后執(zhí)行面哼。當workQueue沒有任務(wù)的時候,worker就會阻塞扫步,直到隊列中有任務(wù)了就取出來繼續(xù)執(zhí)行魔策。
22.mysql索引用過嗎?答:用過河胎,用的最多的就是主鍵唯一索引闯袒。
什么是索引?
索引就像查詞典一樣游岳,根據(jù)目錄進行查找搁吓。
你都知道那些索引類型?
唯一索引(unique):不可出現(xiàn)相同的值吭历,允許又null值;
普通索引(index):允許出現(xiàn)相同的索引內(nèi)容擂橘;
主鍵索引(promary key):不允許出現(xiàn)相同的值晌区;
全文索引(fulltext text):可以針對值中的某個單詞,效率低通贞;
組合索引(combination):將多個字段組到一個索引里朗若,列值的組合必須唯一;
索引雖然好處好昌罩,但過多使用索引也會帶來相反的問題
使用索引雖然可以提高查詢效率哭懈,同時卻會降低表的更新效率
建立索引會占用磁盤空間,索引建立過多茎用,索引文件會膨脹很寬遣总。
23.說一下你對Java動態(tài)代理的理解答:代理類在程序運行時創(chuàng)建的代理方式被稱為動態(tài)代理。最直白的例子就是spring的面向切面編程AOP轨功,我們能在一個切點之前執(zhí)行一些操作旭斥,在一個切點后執(zhí)行一些操作,這個切點就是一個個方法古涧。這些方法所在的類肯定是被代理了垂券,在代理過程中切入一些其他操作。
24.項目中是怎么處理事務(wù)的羡滑?答:Spring提供了好多事務(wù)管理機制菇爪,主要分為編程式事務(wù)和聲明式事務(wù)兩種。編程式事務(wù):是指在代碼中手動的管理事務(wù)的提交柒昏,回滾等操作凳宙,代碼侵入型很強,如下實例:
try{ transactionManager.commit(status);}catch(Exception e) { transactionManager.rollback(status);thrownewInvoiceApplyException("異常失敗");}復(fù)制代碼
聲明式事務(wù):基于AOP面向切面昙楚,他將具體業(yè)務(wù)和事務(wù)處理部分解藕近速,代碼侵入性很低诈嘿,所以在實際項目開發(fā)中使用聲明式事務(wù)較多。(聲明式事務(wù)實現(xiàn)也分為兩種削葱,一是基于TX和AOP的xml配置文件方式奖亚,二是基于@Transactionl注解)如下實例:
//@Transactional 可以作用在接口、類析砸、類方法昔字。@Transactional(rollbackFor = Exception.class)復(fù)制代碼
面試官這時又問:項目中使用注解的方式不會滾,能說下是什么情況嗎首繁?
答:1.檢查你的方法是不是public作郭;
2.你的異常類型是不是unchecked異常(Error或者RuntimeException(比如空指針,1/0))
unchecked異常:空指針等死檢測不到的弦疮,叫unchecked異常夹攒。
checked異常:我們的編譯器是能夠檢測到的,就叫checked異常胁塞;
3.數(shù)據(jù)庫引擎要支持事務(wù)咏尝,如果是MySQL,注意表要使用支持事務(wù)的引擎啸罢,比如innodb编检,如果是myisam,事務(wù)是不起作用的扰才;
4.是否開啟了對注解的解析允懂;
復(fù)制代碼
5.spring是否掃描到你這個包,如下是掃描到org.test下面的包
復(fù)制代碼
6.檢查是不是同一個類中的方法調(diào)用(如a方法調(diào)用同一個類中的b方法)
7.異常是不是被你catch住了衩匣。
25.是否看過spring源碼蕾总,能不能說一下ioc底層的實現(xiàn)原理答:以前我們要調(diào)用某個類中的方法都是要new對象,現(xiàn)在有了ioc我們把對象交給BeanFactory(bean工廠)來管理琅捏,用的時候直接去工廠中取谤专。ioc是通過工廠模式,反射機制來實現(xiàn)的午绳!
26.說說Jvm內(nèi)存模型答:整個Jvm可以分為兩大區(qū)線程共享區(qū)1.方法區(qū)(jdk1.8后方法區(qū)變?yōu)樵臻g):用于存儲已被虛擬機加載的類信息置侍,常量,靜態(tài)變量拦焚,即時編譯器編譯的代碼等數(shù)據(jù)2.堆:Java虛擬機所管理的內(nèi)存中最大的一塊區(qū)域蜡坊,所有線程共享區(qū)域。此內(nèi)存區(qū)域的唯一目的就是存放對象實例赎败, Java堆是垃圾收集器管理的主要區(qū)域(GC堆從內(nèi)存回收的角度講秕衙,收集器基本上使用分代收集算法,所以Java堆還可以細分為:新生代和老年代僵刮,永久代(jdk1.8后改名為元空間))線程私有區(qū)(隨線程生而生据忘,隨線程死而死)1.虛擬機棧:Java方法執(zhí)行的內(nèi)存模型鹦牛,存儲局部變量表,操作棧勇吊,動態(tài)鏈接曼追,方法出口等信息;2.本地方法棧:本地方法被執(zhí)行的時候會創(chuàng)建一個棧幀汉规,用于存放該本地方法的局部變量表礼殊、操作數(shù)棧、動態(tài)鏈接针史、出口信息晶伦;3.程序計數(shù)器:程序計數(shù)器是一塊較小的內(nèi)存空間,可以看作是當前線程所執(zhí)行的字節(jié)碼的行號指示器啄枕。
27.對JVM的垃圾回收的認識?答:垃圾回收器的作用是回收(清除)和查找無用的對象婚陪。以便讓JVM更有效的使用內(nèi)存。
哪些東西需要回收频祝?程序計算器近忙、棧、本地方法棧3個區(qū)域的內(nèi)存隨著線程而生智润,隨線程而滅;內(nèi)存分配大體上在編譯期間都已經(jīng)確認未辆;以此這些區(qū)域內(nèi)存分配和回收都有確定性窟绷;故就不需要jvm打理回收了;方法結(jié)束或線程結(jié)束時咐柜,內(nèi)存自然跟著回收了兼蜈。而堆和方法區(qū)是動態(tài)分配的,只有在程序運行期間才知道哪些對象要建拙友,內(nèi)存分配和回收是動態(tài)的为狸;故jvm只要關(guān)注此部分內(nèi)存就好啦!遗契!
什么時候回收辐棒?其實很簡單-----就是東西沒有人用了,就可以回收了牍蜂!在jvm中漾根,假設(shè)對象沒有線程或方法使用則證明該對象可以回收了。如何判斷對象沒有被引用或使用呢鲫竞?第一種算法--引用計數(shù)器算法(給對象添加一個引用計數(shù)器辐怕,當有引用指向它時計數(shù)器就+1,當引用失效時-1从绘,計數(shù)器為0時就不可被引用了寄疏;此方法簡單高效但有個缺點就是兩個對象互相引用的時候是牢;gc就沒有辦法回收此對象了;故很少采用此算法陕截。)第二種方法--可達性分析算法(其算法思想就是通過gc_root節(jié)點作為起始點驳棱,往下搜索,搜索走過的路徑叫做引用鏈艘策;當一個對象沒有一個gc root相連的話蹈胡,則證明此對象已經(jīng)沒有使用,可以判斷可以回收朋蔫。)
用什么方式回收罚渐?答:1.標記-清除算法( 先標記好,然后統(tǒng)一回收驯妄;清除后產(chǎn)生零碎化內(nèi)存荷并;)2.復(fù)制算法(將可用內(nèi)存劃分為大小相等的兩塊,每次只使用一塊青扔,當這一塊內(nèi)存使用完后源织,就將還存活的對象復(fù)制到另外一塊上;然后再把已經(jīng)用過的內(nèi)存一次清空微猖;)3.分代收集算法(根據(jù)對象存活周期谈息,分為新生代和老年代;針對不同的代采用不同的算法凛剥;)
28.JVM如何GC侠仇,新生代,老年代犁珠,持久代逻炊,都存儲哪些東西?答:JVM的GC算法有:引用計數(shù)器算法犁享,根搜索方法(詳情可參考27)新生代:新生成的對象老年代:在年輕代中經(jīng)歷了N次垃圾回收后仍然存活的對象余素,就會被放到年老代中(生命周期較長的對象)持久代:用于存放靜態(tài)文件,如今Java類炊昆、方法等
29.什么情況下會發(fā)生棧內(nèi)存溢出答:如果線程請求的棧深度大于虛擬機所允許的深度桨吊,將拋出StackOverflowError異常。 如果虛擬機在動態(tài)擴展棧時無法申請到足夠的內(nèi)存空間凤巨,則拋出OutOfMemoryError異常屏积。向有經(jīng)驗的同學(xué)請教,說內(nèi)存使用量飆高磅甩,一般都是中間件引起的內(nèi)存泄漏炊林。因為我們線上服務(wù)使用 Java 語言開發(fā),所以先從 JVM 垃圾收集器 GC 入手卷要,可以比較直觀地看出 JVM 內(nèi)存狀況渣聚。(jstat -gcutilpgrep -u mapp java1s)
30.講講你對Java反射機制的理解独榴?答:首先我們要明白Java中創(chuàng)建對象的方式有四種1.使用new關(guān)鍵字:這是我們最常見的也是最簡單的創(chuàng)建對象的方式2.使用Clone的方法:無論何時我們調(diào)用一個對象的clone方法,JVM就會創(chuàng)建一個新的對象奕枝,將前面的對象的內(nèi)容全部拷貝進去3.使用反序列化:當我們序列化和反序列化一個對象棺榔,JVM會給我們創(chuàng)建一個單獨的對象4.反射什么是反射?反射就是把Java類中的各個部分隘道,映射成一個個的Java對象症歇,拿到這些對象后可以做一些事情。(各個部分:成員變量谭梗,方法忘晤,構(gòu)造方法,等信息)怎么得到反射的類激捏?首先大家要明白一點设塔,咱們寫的代碼是存儲在后綴名是 .java的文件里的,但是它會被編譯远舅,最終真正去執(zhí)行的是編譯后的 .class文件闰蛔;Java是面向?qū)ο蟮恼Z言,一切皆對象图柏,所以java認為 這些編譯后的 class文件序六,這種事物也是一種對象,它也給抽象成了一種類蚤吹,這個類就是Class例诀。
31.mysql事務(wù)隔離級別?答:1.未提交讀:所有事務(wù)都可以看到?jīng)]有提交事務(wù)的數(shù)據(jù)距辆;2.提交讀:事務(wù)成功提交后才可以查詢到;3.重復(fù)讀:同一個事務(wù)多個實例讀取數(shù)據(jù)時暮刃,可能將未提交的記錄查詢出來跨算,而出現(xiàn)幻讀(mysql默認級別);4.可串行化:強制的進行排序椭懊,在每個讀數(shù)據(jù)行上添加共享鎖诸蚕。會導(dǎo)致大量超時現(xiàn)象和鎖競爭;
32.RabbitMQ死信隊列如何處理氧猬?答:不希望:(如果不做任何處理背犯,當消費消息時出現(xiàn)異常,默認會不斷的重試盅抚,這顯然不是我們希望的)我們希望的:可以指定重試的次數(shù)漠魏,重試完了之后進入死信隊列,然后就可以人為的對死信隊列進行處理1.需要將一個Queue關(guān)聯(lián)死信隊列的Exchange和RoutingKey2.在UI頁面可看到多次重試后的消息進入了死信隊列3.處理死信隊列---3.1 通過人工去處理死信隊列---3.2 等待系統(tǒng)正常后把死信隊列中的消息路由到Queue去處理
33.說下對Synchronized關(guān)鍵字的理解答:Synchronized是Java中解決并發(fā)問題的一種常見的方法妄均,也是最簡單一種方法(我們都知道synchronized可以讓線程同步柱锹,所謂同步哪自,就是同一時刻只有一個線程執(zhí)行這段代碼)。三個主要作用:(1)確保線程互斥的訪問同步代碼(2)保證共享變量的修改能夠及時可見(3)有效解決重排序問題三種用法:(1)修飾普通方法(2)修飾靜態(tài)方法(3)修飾代碼塊sychronized原理:
34.mybatis加載mappers有幾種方式禁熏?
答:共4種
1.resource
2.url
3.class
4.package(優(yōu)先級最高)
35.Mybatis底層原理壤巷?
一. mybatis是如何獲取數(shù)據(jù)源的?
答:mybatis獲取數(shù)據(jù)源的創(chuàng)建使用工廠模式瞧毙,基本分為兩種:有帶連接池的數(shù)據(jù)源胧华,不帶連接池的數(shù)據(jù)源(類似jdbc)。
二. mybatis是如何獲取SQL的?
三. mybatis是如何操作的?
四. mybatis有幾種執(zhí)行器宙彪?
五. mybatis一級緩存默認狀態(tài)矩动?怎么創(chuàng)建,怎么使用的您访?
后面還會持續(xù)更新
作者:余生一個帆
鏈接:https://juejin.cn/post/6909289701484527629
來源:掘金
著作權(quán)歸作者所有铅忿。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處灵汪。