基礎(chǔ)題
一匣沼、String,StringBuffer,?StringBuilder?的區(qū)別是什么?String為什么是不可變的捂龄?
1. String是字符串常量释涛,StringBuffer和StringBuilder是字符串變量。StringBuffer是線程安全的倦沧,StringBuilder是非線程安全的唇撬。具體來說String是一個不可變的對象,每次修改String對象實際上是創(chuàng)新新對象展融,并將引用指向新對象窖认。效率很低。StringBuffer
是可變的,即每次修改只是針對其本身扑浸,大部分情況下比String效率高烧给,StringBuffer保證同步(synchronized),所以線程安全喝噪。StringBuilder沒有實現(xiàn)同步础嫡,所以非線程安全。但效率應(yīng)該比StringBuffer高酝惧。StringBuffer使用時最好指定容量榴鼎,這樣會比不指定容量快30%-40%,甚至比不指定容量的StringBuilder還快晚唇。
二巫财、VECTOR,ARRAYLIST,?LINKEDLIST的區(qū)別是什么?
vector是同步的哩陕,arraylist和linkedlist不是同步的翁涤。底層方面,vector與arraylist都是基于object[]array實現(xiàn)的萌踱,但考慮vector線程安全,所以arraylist效率上回比vector較快号阿。元素隨機訪問上并鸵,vector與arraylist是基本相同的,時間復(fù)雜度是O(1)扔涧,linkedlist的隨機訪問元素的復(fù)雜度為O(n)园担。但在插入刪除數(shù)據(jù)上,linkedlist則比arraylist要快很多枯夜。linkedlist比arraylist更占內(nèi)存弯汰,因為linkedlist每個節(jié)點上還要存儲對前后兩個節(jié)點的引用。
三湖雹、HASHTABLE,?HASHMAP咏闪,TreeMap區(qū)別
Hashmap和HashTable都實現(xiàn)了Map接口,但HashTable是線程安全的摔吏,HashMap是非線程安全的鸽嫂。HashMap中允許key-value值均為null,但HashTable則不允許征讲。HashMap適合單線程据某,HashTable適合多線程。HashTAble中的hash數(shù)字默認大小是11诗箍,增加方式為old*2+1,HashMap中的hash默認大小為16癣籽,且均為2的指數(shù)。TreeMap則可以將保持的數(shù)據(jù)根據(jù)key值進行排列,可以按照指定的排序方式筷狼。默認為升序瓶籽。
四、ConcurrentHashMap和HashTable的區(qū)別
兩者均應(yīng)用于多線程中桑逝,但當(dāng)HashTable增大到一定程度時棘劣,其性能會急劇下降。因為迭代時會被鎖很長時間楞遏。但ConcurrentHashMap則通過引入分割來保證鎖的個數(shù)不會很大茬暇。簡而言之就是HashTable會鎖住真?zhèn)€map,而ConcurrentHashMap則只需要鎖住map的一個部分寡喝。
五糙俗、Tomcat,apache预鬓,jboss的區(qū)別
Tomcat是servlet容器巧骚,用于解析jsp,servlet格二。是一個輕量級的高效的容器劈彪;缺點是不支持EJB,只能用于Java應(yīng)用顶猜。
Apache是http服務(wù)器(web服務(wù)器)沧奴,類似于IIS可以用來建立虛擬站點,編譯處理靜態(tài)頁面长窄。支持SSL技術(shù)滔吠,支持多個虛擬主機等功能。
Jboss是應(yīng)用服務(wù)器挠日,運行EJB的javaee應(yīng)用服務(wù)器疮绷,遵循javaee規(guī)范,能夠提供更多平臺的支持和更多集成功能嚣潜,如數(shù)據(jù)庫連接冬骚,JCA等。其對servlet的支持是通過集成其他servlet容器來實現(xiàn)的郑原。如tomcat唉韭。
六、GET?POST區(qū)別
get是從服務(wù)器上獲取數(shù)據(jù)犯犁,post是向服務(wù)器發(fā)送數(shù)據(jù)属愤。
get是把參數(shù)數(shù)據(jù)隊列加到提交表單的action屬性所指的URL中,值和表單內(nèi)各個字段一一對應(yīng)酸役,在url中可以看到住诸。post是通過HTTPpost機制驾胆,將表單內(nèi)各個字段與其內(nèi)容放置在html header內(nèi)一起傳送到action屬性所指的url地址。
對于get方式贱呐,服務(wù)區(qū)端用request.QueryString獲取變量值丧诺,對于post方式,服務(wù)器端用request.Form獲取提交的數(shù)據(jù)奄薇。get傳送的數(shù)據(jù)量較小驳阎,post較大,一般不受限制馁蒂。get安全性比post要低呵晚,但執(zhí)行效率較高。
七沫屡、SESSION,?COOKIE區(qū)別
session數(shù)據(jù)放在服務(wù)器上饵隙,cookie則放在客戶瀏覽器上。cookie不太安全沮脖,因為可以分析出本地cookie金矛,并進行cookie欺騙,考慮安全應(yīng)使用session勺届。session會在一定時間內(nèi)保存在服務(wù)器上驶俊,當(dāng)訪問增多時,會比較占用服務(wù)器的性能免姿,考慮減輕服務(wù)器壓力則應(yīng)該使用cookie废睦。單個cookie保持的數(shù)據(jù)不超過4k,很多瀏覽器都限制要給站點最多保存20個cookie养泡。
八、Servlet的生命周期
主要分三個階段:初始化——調(diào)用init()方法奈应,響應(yīng)客戶請求階段——調(diào)用service()方法澜掩,終止階段——調(diào)用destroy方法。工作原理:客戶發(fā)送一個請求杖挣,servlet調(diào)用service方法對請求進行響應(yīng)肩榕,即對請求方式進行匹配,選擇調(diào)用doGet惩妇、doPost方法等株汉,然后進入對于的方法中調(diào)用邏輯層的方法,實現(xiàn)對客戶的響應(yīng)歌殃。自定義的servlet必須首先servlet接口乔妈。
具體生命周期包括:裝載Servlet、服務(wù)器創(chuàng)建Servlet實例氓皱、服務(wù)器調(diào)用Servlet的init()方法路召、客戶請求到達服務(wù)器勃刨、服務(wù)器創(chuàng)建請求對象、服務(wù)創(chuàng)建相應(yīng)對象股淡、服務(wù)器激活Servlet的service方法身隐,請求對象和響應(yīng)對象作為service()方法的參數(shù)、service()方法獲得關(guān)于請求對象的信息唯灵,處理請求贾铝,訪問其他資源,獲得需要的信息埠帕、service()方法可能激活其他方法以處理請求垢揩,如doGet(),doPost()
九搞监、HTTP?報文包含內(nèi)容
請求方法包括GET,POST,HEAD,PUT,TRACE,OPTIONS,DELETE水孩。請求頭如:Host、User-Agent琐驴、Connection俘种、Accept-Charset等召调。請求頭部的最后會有一個空行诀姚,表示請求頭部結(jié)束脐彩,接下來為請求正文芯义,這一行非常重要俏讹,必不可少秸弛。請求正文為可選部分裁厅,如get就沒有柔昼。
十馍乙、Statement與PreparedStatement的區(qū)別,什么是SQL注入布近,如何防止SQL注入
使用PreparedStatement可以提升代碼的可讀性和可維護性,可以盡最大可能提高性能丝格。因為Statement每次執(zhí)行一個SQL命令都會對其編譯撑瞧,但PreparedStatement則只編譯一次。PreparedStatement就類似于流水線生產(chǎn)显蝌。另一方面PreparedStatement可以極大提高安全性:它對傳遞過來的參數(shù)進行了強制參數(shù)類型轉(zhuǎn)換预伺,確保插入或查詢數(shù)據(jù)時,與底層數(shù)據(jù)庫格式匹配曼尊。
SQL注入:就是通過將sql命令插入到web表單遞交或輸入域名或頁面請求的查詢字符串酬诀,最終達到欺騙服務(wù)器執(zhí)行惡意SQL命令。如sql命令:select id from test where name='1' or 1=1; drop table test,但用PreparedStatement就可以避免這種問題骆撇。
十一瞒御、redirect,?forward區(qū)別
redirect:服務(wù)器根據(jù)邏輯,發(fā)送一個狀態(tài)碼神郊,告訴瀏覽器重新去請求那個地址葵腹。所以地址欄顯示是新的url高每。forward是指服務(wù)器請求資源,直接訪問目標地址url践宴,把響應(yīng)的內(nèi)容讀取過來并再發(fā)送給瀏覽器鲸匿,瀏覽器并不知道資源從哪里來,所以地址欄不變阻肩。
redirect不能共享數(shù)據(jù)带欢,forward轉(zhuǎn)發(fā)頁面和轉(zhuǎn)發(fā)到頁面可以貢獻request中的數(shù)據(jù)。redirect用于注銷烤惊,forward用于登陸乔煞。forward效率高于redirect。
十二柒室、關(guān)于JAVA內(nèi)存模型渡贾,一個對象(兩個屬性,四個方法)實例化100次雄右,現(xiàn)在內(nèi)存中的存儲狀態(tài)空骚,幾個對象,幾個屬性擂仍,幾個方法囤屹。
Java新建的對象都放在堆里,如果實例化100次逢渔,堆中產(chǎn)生100個對象肋坚,一般對象與其屬性和方法屬于一個整體,但如果屬性和方法是靜態(tài)的肃廓,則屬性和方法只在內(nèi)存中存一份智厌。
十三、談?wù)凥ibernate的理解盲赊,一級和二級緩存的作用峦剔,在項目中Hibernate都是怎么使用緩存的
一級緩存為session基本的緩存,是內(nèi)置的不能卸載角钩。一個Session做了一個查詢操作,它會把這個結(jié)果放在一級緩存中递礼,如果短時間內(nèi)這個session又做了同一個操作羹幸,那么hibernate就直接從一級緩存中獲取數(shù)據(jù)。
二級緩存是SessionFactory的緩存栅受,分為內(nèi)置緩存和外置緩存兩類将硝。即查詢結(jié)果放在二級緩存中,如果同一個sessionFactory創(chuàng)建的某個session執(zhí)行了相同的操作痰腮,hibernate就會從二級緩存中獲取結(jié)果。適合放在二級緩存中的數(shù)據(jù)包括:很少被修改的數(shù)據(jù)律罢,不是很重要的數(shù)據(jù)膀值,允許出現(xiàn)偶偶并發(fā)的數(shù)據(jù)误辑,不會被并發(fā)訪問的數(shù)據(jù)巾钉,參考數(shù)據(jù)。不適合放在二級緩存中的數(shù)據(jù):經(jīng)常被修改的數(shù)據(jù)潦匈,財務(wù)數(shù)據(jù)师骗,絕對不允許出現(xiàn)并發(fā),與其他應(yīng)用共享的數(shù)據(jù)寒屯。
十四寡夹、反射講一講厂置,主要是概念,都在哪需要反射機制,反射的性能智绸,如何優(yōu)化
能夠分析類能力的程序稱為反射瞧栗。反射機制可以用來:在運行中分析類的能力,在運行中查看對象海铆,如編寫一個toString方法供所有類使用。實現(xiàn)通用的數(shù)據(jù)操作代碼殴边。利用Method對象锤岸,這個對象很像C++的指針。
反射性能優(yōu)化方法主要為設(shè)置不用做安全檢查赏枚。
十五晓猛、談?wù)凥ibernate與Ibatis的區(qū)別戒职,哪個性能會更高一些
Ibatis相當(dāng)較為簡單,容易上手磕秤,Hibernate比較復(fù)雜市咆,門檻較高再来。如果系統(tǒng)需要處理數(shù)據(jù)量很大芒篷,性能要求很高,需要執(zhí)行高度優(yōu)化的sql語句才能達到性能要求挠他,則此時Ibatis會比較好殖侵。
對不同數(shù)據(jù)庫支持方面Hibernate較好镰烧,因為Ibatis需要修改的字段較多拌滋。另外Hibernate現(xiàn)已成為主流的o/r Mapping框架败砂,開發(fā)效率高。
十六坚芜、對Spring的理解斜姥,項目中都用什么铸敏?怎么用的杈笔?對IOC、和AOP的理解及實現(xiàn)原理
十七球榆、線程同步禁筏,并發(fā)操作怎么控制
線程同步不一定就是同時篱昔,而是協(xié)同步驟旱爆,或協(xié)同步調(diào)。線程同步就是多個線程在邏輯上互有因果關(guān)系脆烟,所以要對其執(zhí)行順序進行協(xié)調(diào)邢羔。
線程并發(fā)是指同一時間間隔內(nèi)桑孩,多個線程同時執(zhí)行流椒。如果線程在時間上能夠區(qū)分,那么就可以上線程休眠指定的時間來進行同步惯裕,可用sleep()方法完成蜻势。如果線程在時間上不能區(qū)分握玛,但在邏輯順序上可以區(qū)分的話,那么可用jion()方法來完成冕屯,一個先執(zhí)行完愕撰,然后執(zhí)行另一個醋寝。如果線程設(shè)計較為復(fù)雜音羞,那么就只有通過wait()嗅绰,notify()方法來完成了
十八、描述struts的工作流程翠语。
簡略過程就是web應(yīng)用啟動肌括,接收用戶請求并進行匹配酣难,返回用戶請求信息憨募。
1. 在web應(yīng)用啟動時菜谣,加載并初始化ActionServlet,ActionServlet從struct-config.xml文件中讀取配置信息晚缩,把它們存放到各個配置對象中橡羞。
2. 當(dāng)ActionServlet接收到一個客戶請求時济舆,首先檢索和用戶請求相配的ActionMapping實例滋觉,如果不存在椎侠,返回用戶請求路徑無效信息措拇。
3. 如ActionForm實例不存在丐吓,則創(chuàng)建一個ActionForm對象券犁,把客戶提交的表單數(shù)據(jù)保存到ActionForm對象中。
4. 根據(jù)配置信息決定是否需要表單驗證荞估。如果需要驗證勘伺,就調(diào)用ActionForm的Validate()方法飞醉。如果Valiedate()方法返回null或返回一個不包含ActionMessage的ActionErrors對象笤妙,則表示表單驗證成功蹲盘。
5. ActionServlet更加ActionMapping實例包含的映射信息決定請請求轉(zhuǎn)發(fā)給哪個Action召衔。如果相應(yīng)的Action實例不存在,則先創(chuàng)建這個實例趣席,然后調(diào)用Action的execute()方法宣肚。
6. Action的execute()方法返回一個ActionForward對象霉涨,ActionServlet再把客戶請求轉(zhuǎn)發(fā)給ActionForward對象指向的JSP組建。
7. ActionForward對象指向的jsp組件生成的動態(tài)網(wǎng)頁楼镐,返回給客戶框产。
十九秉宿、Tomcat的session處理屯碴,如果讓你實現(xiàn)一個tomcatserver窿锉,如何實現(xiàn)session機制
當(dāng)一個session開始時嗡载,Servlet容器會創(chuàng)建一個HttpSession對象洼滚,在某些情況下把這些HttpSession對象從內(nèi)存中轉(zhuǎn)移到文件系統(tǒng)中或數(shù)據(jù)庫中遥巴。需要訪問的時候?qū)⑺鼈冚d入到內(nèi)存中。這樣的好處就是節(jié)省內(nèi)存拾弃,當(dāng)web服務(wù)器產(chǎn)生故障時豪椿,還可以從文件系統(tǒng)或數(shù)據(jù)庫中恢復(fù)Session的數(shù)據(jù)搭盾。管理session有兩個類:1)StandardManager,這是一個默認的類澜建,當(dāng)tomcat啟動或重載時將會session對象保存到指定文件中霎奢。2)PersistentManager,管理方式更加靈活碍彭,具有容錯能力悼潭,可以及時把Session備份到Session Store中舰褪,可以控制內(nèi)存中Session的數(shù)量占拍。
二十晃酒、關(guān)于Cache(Ehcache,Memcached)
Memcache:分布式內(nèi)存對象緩存系統(tǒng)贝次,占用其他機子的內(nèi)存。很多互聯(lián)網(wǎng)敲茄,負載均衡三臺(以三臺為例)web服務(wù)器可以共享一臺Memcache的資源堰燎。傳遞的信息以鍵值對的形式存儲爽待。傳遞的數(shù)據(jù)要實現(xiàn)序列化鸟款。
Oscache:頁面級緩存(網(wǎng)上強調(diào)最多的東西),占用本機的內(nèi)存資源∽榱ǎ可 以選擇緩存到硬盤伶贰,如存取到硬盤重啟服務(wù)也可重新獲得上次持久化的資源黍衙,而如果緩存到內(nèi)存就不行琅翻。一般沒必要緩存到硬盤方椎,因為I/O操作也是比較耗資源钧嘶,和從數(shù)據(jù)庫取往往優(yōu)勢很小有决。Oscache存取數(shù)據(jù)的作用域分為application和session兩種书幕。
EhCache:Hibernate緩存按咒,DAO緩存励七,安全性憑證緩存(Acegi),Web緩存吼野,應(yīng)用持久化和分布式緩存瞳步。EhCache在默認情況下单起,即在用戶未提供自身配置文件ehcache.xml或ehcache-failsafe.xml時嘀倒,EhCache會依據(jù)其自身Jar存檔包含的ehcache-failsafe.xml文件所定制的策略來管理緩存测蘑。如果用戶在classpath下提供了ehcache.xml或ehcache-failsafe.xml文件碳胳,那么EhCache將會應(yīng)用這個文件挨约。如果兩個文件同時提供烫罩,那么EhCache會使用ehcache.xml文件的配置洽故。
二一时甚、sql的優(yōu)化相關(guān)問題
1. 對查詢優(yōu)化荒适,避免全表掃描
2. 盡量避免where子句中對段進行null值判斷刀诬,否則將導(dǎo)致引擎放棄使用索引而進行全表掃描陕壹。
3. 盡量避免where子句中出現(xiàn)!=或<>糠馆,否則將導(dǎo)致引擎放棄使用索引而進行全表掃描又碌。
4. 盡量避免where子句中出現(xiàn)or來連接條件。
5. 慎用in和not in癌别,否則導(dǎo)致全表掃描
6. where中不要用函數(shù)操作规个。
7.?Update 語句诞仓,如果只更改1墅拭、2個字段谍婉,不要Update全部字段穗熬,否則頻繁調(diào)用會引起明顯的性能消耗唤蔗,同時帶來大量日志妓柜。
8.?對于多張大數(shù)據(jù)量(這里幾百條就算大了)的表JOIN涯穷,要先分頁再JOIN拷况,否則邏輯讀會很高赚瘦,性能很差蚤告。
9.?盡可能的使用 varchar/nvarchar 代替 char/nchar杜恰,節(jié)省空間,提高查詢效率
10.?select count(*) from table笼踩;這樣不帶任何條件的count會引起全表掃描嚎于,并且沒有任何業(yè)務(wù)意義挟冠,是一定要杜絕的于购。
二二、oracle中?rownum與rowid的理解知染,一千條記錄我查200到300的記錄怎么查肋僧?
二三、如何分析ORACLE的執(zhí)行計劃控淡?
二四嫌吠、?DB中索引原理掺炭,種類辫诅,使用索引的好處和問題是什么?
原理:因為檢索磁盤比對數(shù)據(jù)涧狮,需要大量的時間和IO炕矮,所以就需要構(gòu)造某列的數(shù)據(jù)的btree、hash值勋篓、位圖索引吧享。一般的索引能快速的查找比對魏割,而索引的值記錄了磁盤的位置譬嚣,直接讀取數(shù)據(jù)庫字段對應(yīng)位置的內(nèi)容。
索引好處:加快數(shù)據(jù)檢索速度钞它、加速表與表之間的連接特別是實現(xiàn)數(shù)據(jù)的參考完整性方面有特別的意義拜银、減少查詢中分組和排序的時間,使用優(yōu)化隱藏器遭垛,提高系統(tǒng)性能尼桶。
缺點:創(chuàng)建和維護索引需要時間,索引需要占用物理空間锯仪,當(dāng)對表中的數(shù)據(jù)驚醒增刪改時所有也需要動態(tài)維護泵督。
二五、JVM垃圾回收實現(xiàn)原理庶喜。垃圾回收的線程優(yōu)先級小腊。
JVM的堆空間中主要分為年輕代救鲤、年老代和永久代。年輕代和年老代是存儲動態(tài)產(chǎn)生的對象秩冈。永久代主要是存儲java類信息本缠,包括解析得到的方法屬性、字段等等入问。永久代基本不參與垃圾回收丹锹。年輕代分為一個eden區(qū)和兩個相同的survior區(qū)。剛開始創(chuàng)建的對象都放置在eden區(qū)芬失。這樣主要是為了將生命周期短的對象盡量留在年輕代中楣黍。當(dāng)eden區(qū)申請不到空間時,進行minorGC麸折,把存活的對象拷貝到survior锡凝。年老代主要存放生命周期比較長的對象,如緩存對象垢啼。具體JVM垃圾回收過程如下:
1窜锯、對象在Eden區(qū)完成內(nèi)存分配。2芭析、當(dāng)Eden區(qū)滿了锚扎,在創(chuàng)建對象就會申請不到空間,則觸發(fā)minorGC馁启,進行young(eden區(qū)和1survivor區(qū)的垃圾回收)驾孔。3、在minorGC時惯疙,Eden不能被回收的對象唄放入到空的survior(即Eden肯定被清空)翠勉,另一個survivor里不能被GC回收的地想也會被放入到這個survivor,始終保證一個survivor是空的霉颠。4对碌、當(dāng)完成第三步的時候、如果發(fā)現(xiàn)survivor滿了蒿偎,則這些對象唄copy到old區(qū)朽们,或者survivor并沒有滿,但有些對象已經(jīng)足夠old了诉位,也被放入到old區(qū)骑脱。當(dāng)old區(qū)北放滿之后,進行fullGC苍糠。
二六叁丧、jvm 最大內(nèi)存設(shè)置。設(shè)置的原理。結(jié)合垃圾回收講講拥娄。
?JVM內(nèi)存可以分為堆內(nèi)存和非堆內(nèi)存坷衍,堆內(nèi)存給開發(fā)人員用的,非堆內(nèi)存給JVM本身用的条舔,用來存放類型信息枫耳,即使GC時也不會釋放空間。
堆內(nèi)存設(shè)置:
-Xms 初始堆內(nèi)存孟抗,默認物理內(nèi)存1/64迁杨,也是最小分配堆內(nèi)存,當(dāng)空余堆內(nèi)存小于40%時凄硼,會增加到-Xms的最大限制铅协。
-Xmx 最大堆內(nèi)存分配,默認物理內(nèi)存1/4摊沉,當(dāng)空余堆內(nèi)存大于70%時狐史,會減小打-Xms的最小限制。
非堆內(nèi)存設(shè)置:
-XX:PermSize 非堆內(nèi)存的初始值说墨,默認物理內(nèi)存的1/64骏全,也是最小非堆內(nèi)存。
-XX:MaxPermSize 非堆內(nèi)存最大值尼斧,默認物理內(nèi)存的1/4姜贡。
查看堆大小命令為Runtime.getRuntime().maxMemory()。
二七棺棵、jvm怎樣通過參數(shù)調(diào)整內(nèi)存大小
?本地環(huán)境變量中JVM參數(shù)設(shè)置:
new一個JAVA_OPTS:
variable name: JAVA_OPTS
variable value: -Xms256M -Xmx512M -XX:PermSize=256M -XX:MaxPermSize=512M
eclipse中參數(shù)設(shè)置:在缺省VM參數(shù)中輸入:-Xmx128m -Xms64m -Xmn32m -Xss16m
二八楼咳、進程與線程的區(qū)別
?線程是進程的一個單元,也是進程內(nèi)的可調(diào)度實體烛恤。區(qū)別就是:1母怜、進程內(nèi)的線程共享地址空間,進程則自己獨立的地址空間缚柏。2苹熏、進程是資源分配和擁有的單位,同一個進程內(nèi)的線程共享進程資源船惨。3柜裸、線程是處理器調(diào)度的基本單位缕陕。4粱锐、兩者均可并發(fā)執(zhí)行。
二九扛邑、怎樣避免死鎖
1. 使用事務(wù)時怜浅,盡量縮短事務(wù)idea邏輯處理過程,及早提交或回滾事務(wù)
2. 設(shè)置死鎖的超時參數(shù)為合理范圍,如3-10分鐘恶座,若超過時間搀暑,自動放棄本次操作,避免進程懸掛跨琳。
3. 優(yōu)化程序自点,檢查并避免死鎖現(xiàn)象出現(xiàn)。
4. 對所有的腳本和sp都要仔細測試脉让。
5. 所有的sp都要有錯誤處理桂敛。
6. 一般不要修改sql事務(wù)的默認級別。不推薦強行加鎖溅潜。
三十、垃圾回收算法使用的產(chǎn)品滚澜、場景
標記-清除算法:標記階段粗仓,確定所有要回收的對象,并標記设捐,清除階段則將需要回收的對象清除借浊。
復(fù)制算法:把內(nèi)存分為大小相等的兩塊,每次使用其中的一塊萝招,當(dāng)垃圾回收時巴碗,把存活的對象復(fù)制到另一塊上,然后把這塊內(nèi)存整個清理掉即寒。兩塊內(nèi)存比是8:1
標記整理算法:把存活的對象往內(nèi)存的一端移動橡淆,然后直接回收邊界以外的內(nèi)存。標記-整理算法提高了內(nèi)存的利用率母赵,并且它適合在收集對象存活時間較長的老年代逸爵。
分代回收算法:根據(jù)對象的存活時間把內(nèi)存分為新生代和老年代,根據(jù)各代對象的存活特點凹嘲,每代采用不同的GC算法师倔。新生代用標記-復(fù)制算法,老年代用標記-整理算法周蹭。
三一趋艘、實際項目中JVM調(diào)優(yōu)
1、JVM啟動參數(shù):調(diào)整各代的內(nèi)存比例和垃圾回收算法凶朗,提高吞吐量瓷胧。
2、改進程序邏輯算法棚愤,提高性能
3搓萧、自定義封裝線程池杂数,解決用戶響應(yīng)時間長的問題。比如設(shè)置線程最小數(shù)量瘸洛、最大數(shù)量
4揍移、連接池
三二、jdk并發(fā)包的集合介紹
Map并發(fā)包反肋,其實現(xiàn)為ConcurrentHashMap那伐,它實現(xiàn)了ConcurrentMap接口。put方法為根據(jù)計算出的hash值去獲取segment對象石蔗。找到segment對象后調(diào)用該對象的put方法完成操作喧锦。segment中的put方法則是先加鎖,之后判斷數(shù)組大小抓督,然后覺得是否擴充燃少。然后得到key索要放置的位置。
List并發(fā)包铃在,客在高并發(fā)環(huán)境下使用CopyOnWriteArrayList代替ArrayList阵具。添加元素是利用數(shù)組的copy功能和加鎖機制。并發(fā)情況下定铜,CopyOnWriteArrayList比ArrayList略快了些阳液。
set并發(fā),CopyOnWriteSet和CopyOnWriteArrayList底層實現(xiàn)差不多就是在添加元素時會進行唯一性判斷揣炕,如果對象數(shù)組已經(jīng)含有重復(fù)的元素帘皿,不進行增加處理。
queue并發(fā)畸陡,并發(fā)類是ArrayBlockingQueue鹰溜,底層為數(shù)組,并對關(guān)鍵的方法入隊丁恭、出隊操作加入了鎖隊機制曹动。
Atomic系列類,比如AtomicInteger類牲览,通過使用計數(shù)器操作時墓陈,一般為了避免線程安全問題,在方法上加鎖操作第献。有了并發(fā)包下的原子系列類贡必,我們就可以直接使用。
三三庸毫、線程之間的通信
主要包括互斥鎖仔拟、條件變量、讀寫鎖和線程信號燈岔绸。
互斥鎖:以排他方式防止數(shù)據(jù)被并發(fā)修改理逊。互斥鎖兩個狀態(tài)0和1盒揉。具體為申請鎖晋被、占用鎖以防止數(shù)據(jù)被修改,此時默認阻塞等等刚盈,最后釋放鎖羡洛。
條件變量通信機制:原理,條件變量出現(xiàn)時藕漱,可以彌補互斥鎖的缺陷欲侮,有些問題僅僅依靠互斥鎖無法解決。但條件變量不能單獨使用肋联,必須配合互斥鎖一起實現(xiàn)對資源的互斥訪問威蕉。
讀寫鎖:在對數(shù)據(jù)讀寫時,往往讀占主要部分橄仍∪驼牵基本原則是如果其他線程讀數(shù)據(jù),則允許其他線程執(zhí)行讀操作侮繁,但不允許寫操作虑粥。如果有其他線程申請寫操作,則其他線程不能申請讀操作和寫操作宪哩。
線程信號:線程擁有與信號相關(guān)的私有數(shù)據(jù)——線程信號掩碼娩贷。線程可以向別的線程發(fā)送信號,每個線程可以設(shè)置自己的阻塞集合锁孟。所有線程中彬祖,同一信號子任何線程里的對該信號的處理一定相同。
三四品抽、介紹threadlocal
?可以叫做線程本地變量或線程本地存儲涧至。ThreadLocal為變量在每個線程中都創(chuàng)建了一個副本,每個線程都可以訪問自己內(nèi)部的副本變量桑包。但可能這樣做會導(dǎo)致內(nèi)存占用較大南蓬。
ThreadLocal類的幾個方法:get() 用來獲取ThreadLocal在當(dāng)前線程中保存的變量副本,set()用來設(shè)置當(dāng)前線程中變量的副本哑了,remove()用來一沖當(dāng)前線程中的變量副本赘方,initialValue()一般用來在使用時進行重寫,是一個延遲加載方法弱左。最常見的ThreadLocal使用場景是用來解決數(shù)據(jù)庫連接窄陡、Session管理等。
三五拆火、jdbc的操作過程
?加載數(shù)據(jù)庫驅(qū)動包跳夭、連接數(shù)據(jù)庫涂圆、使用sql語句操作數(shù)據(jù)庫、關(guān)閉數(shù)據(jù)庫連接
三六币叹、HTTP1.1的新特性
?支持持續(xù)連接润歉,通過建立一個TCP后,發(fā)送請求并得到響應(yīng)颈抚,然后發(fā)送更多的請求并得到更多的響應(yīng)踩衩。通過把簡歷和釋放TCP連接的開銷分攤到多個請求上,則對每個請求而言,優(yōu)于TCP而造成的相對開銷被大大降低。而且還可以發(fā)送流水線請求镊讼。
三七、異常處理褐鸥,包含了什么
參考:http://lavasoft.blog.51cto.com/62575/18920/
三八、堆排序與快速排序
View Code
View Code
堆排序是漸進最優(yōu)的比較排序算法赐稽,達到了O(nlgn)這一下界晶疼,而快排有一定的可能性會產(chǎn)生最壞劃分,時間復(fù)雜度可能為O(n^2)又憨。堆排比較的幾乎都不是相鄰元素翠霍,對cache極不友好。數(shù)學(xué)復(fù)雜度并不一定代表實際運行的復(fù)雜度蠢莺。
三九寒匙、Collection有哪些類
Set, List, Map, SortedSet, SortedMap, HashSet, TreeSet, ArrayList, LinkedList, Vector, Collections, Arrays, AbstractCollection
四十、Hashcode總為1會怎樣躏将,如何解決hash沖突
當(dāng)所有對象Hashcode返回都為1時锄弱,所有對象都出現(xiàn)hash沖突,其性能會下降
解決hash沖突:
線性再散列法祸憋、插入元素時会宪,如果發(fā)生沖突,算法會簡單的遍歷hash表蚯窥,直到找到表中的下一個空槽掸鹅,并將該元素放入該槽中。查找元素時拦赠,首先散列值所指向的槽巍沙,如果沒有找到匹配,則繼續(xù)遍歷hash表荷鼠,直到:(1)找到相應(yīng)的元素句携;(2)找到一個空槽(指示查找的元素不存在);(3)整個hash表遍歷完畢(指示該元素不存在并且hash表是滿的)允乐。
非線性再散列法矮嫉、線性再散列法是從沖突位置開始削咆,采用一個步長以順序方式遍歷hash表,來查找一個可用的槽蠢笋,從上面的討論可以看出拨齐,它容易產(chǎn)生聚集現(xiàn)象。非線性再散列法可以避免遍歷散列表挺尿,它會計算一個新的hash值奏黑,并通過它跳轉(zhuǎn)到表中一個完全不同的部分炊邦。
外部拉鏈法编矾、將hash表看作是一個鏈表數(shù)組,表中的每個槽要不為空馁害,要不指向hash到該槽的表項的鏈表窄俏。
四一、如何用兩個隊列實現(xiàn)棧
即可以將A隊列作為棧push碘菜,B隊列作為棧pop凹蜈。量隊列數(shù)據(jù)相同。
四二忍啸、Object的通用方法
通用方法有equals(), finalize(), toString(), 其他native方法有hashcode(),?registerNatives(), getClass(), clone(), notify(), notifyAll(), wait()等仰坦。
四三、Java中如何實現(xiàn)多態(tài)
多態(tài)是OOP中的一個重要特性计雌,主要用來實現(xiàn)動態(tài)聯(lián)編悄晃,程序的最終狀態(tài)只有在執(zhí)行過程中才被決定而非在編譯期間就決定了。有利于提高大型系統(tǒng)的靈活性和擴展性凿滤。
多態(tài)的三個必要條件:有繼承妈橄、有方法重寫、父類引用指向子類對象翁脆。
引用變量的兩種類型:編譯時類型由申明類型決定眷蚓,運行時類型由實際對應(yīng)的對象決定。
View Code
View Code
多態(tài)內(nèi)存:
四四反番、Java內(nèi)存泄漏
內(nèi)存泄漏一般情況下有兩種情況:C++/C語言中沙热,在堆中分配的內(nèi)存,沒有將其釋放掉就刪除了所有能訪問到這塊內(nèi)存的方式全部刪除罢缸。(如指針重新賦值)
另一種情況就是在內(nèi)存對象已經(jīng)不需要時校读,還保留這塊內(nèi)存和它的訪問方式(引用),由于Java中GC機制祖能,所以Java中的內(nèi)存泄漏通常指第二種情況歉秫。
盡管對于C/C++中的內(nèi)存泄露情況來說,Java內(nèi)存泄露導(dǎo)致的破壞性小养铸,除了少數(shù)情況會出現(xiàn)程序崩潰的情況外雁芙,大多數(shù)情況下程序仍然能正常運行轧膘。但是,在移動設(shè)備對于內(nèi)存和CPU都有較嚴格的限制的情況下兔甘,Java的內(nèi)存溢出會導(dǎo)致程序效率低下谎碍、占用大量不需要的內(nèi)存等問題。這將導(dǎo)致整個機器性能變差洞焙,嚴重的也會引起拋出OutOfMemoryError蟆淀,導(dǎo)致程序崩潰。
在不涉及復(fù)雜數(shù)據(jù)結(jié)構(gòu)情況下澡匪,Java內(nèi)存泄漏表現(xiàn)為一個內(nèi)存對象的生命周期超出程序需要它的長度熔任。(稱為對象游離)。
內(nèi)存泄漏實例:Java堆溢出唁情、虛擬機棧和本地方法棧溢出疑苔、方法區(qū)和運行時常量池溢出、本機直接內(nèi)存溢出
四五甸鸟、final字段總結(jié)
1. final類不能被繼承惦费,其中的方法也是默認final類型,沒有子類抢韭。
2. final方法不能被子類覆蓋薪贫,但可以繼承
3. final變量表示常量,只能被賦值一次賦值后不改變
4. final不能用于構(gòu)造方法
四六刻恭、override(重寫)和overload(重載)區(qū)別
override:子類在繼承父類時瞧省,子類可以定義某些方法與父類的方法名稱、參數(shù)個數(shù)吠各、類型臀突、順序、返回值類型一致贾漏,但調(diào)用時自動調(diào)用子類的方法候学,父類相當(dāng)于被覆蓋了。
overload:可以表現(xiàn)在類的多態(tài)上纵散,函數(shù)名相同梳码,但其他參數(shù)個數(shù)、類型伍掀、順序掰茶、返回值等都不相同。
四七蜜笤、static初始化
未經(jīng)初始化的全局靜態(tài)變量會被自動初始化為0濒蒋。
1、具有1-5工作經(jīng)驗的,面對目前流行的技術(shù)不知從何下手沪伙,
需要突破技術(shù)瓶頸的可以加瓮顽。
2、在公司待久了围橡,過得很安逸暖混,
但跳槽時面試碰壁。
需要在短時間內(nèi)進修翁授、跳槽拿高薪的可以加拣播。
3、如果沒有工作經(jīng)驗收擦,但基礎(chǔ)非常扎實贮配,對java工作機制,
常用設(shè)計思想炬守,常用java開發(fā)框架掌握熟練的牧嫉,可以加剂跟。
4减途、覺得自己很牛B,一般需求都能搞定曹洽。
但是所學(xué)的知識點沒有系統(tǒng)化鳍置,很難在技術(shù)領(lǐng)域繼續(xù)突破的可以加。
5. 群號:高級架構(gòu)群 Java進階群:180705916.備注好信息送淆!送架構(gòu)視頻税产。
6.阿里Java高級大牛直播講解知識點,分享知識偷崩,
多年工作經(jīng)驗的梳理和總結(jié)辟拷,帶著大家全面、
科學(xué)地建立自己的技術(shù)體系和技術(shù)認知阐斜!