Java面試題

Java內(nèi)存分配有那些?

基本來(lái)說(shuō)分為:

  • 寄存器:JVM內(nèi)部虛擬寄存器,存取速度非???程序不可控制.
  • 棧區(qū):保存局部變量的值,包括:1.用來(lái)保存基本數(shù)據(jù)類(lèi)型的值2.保存類(lèi)的實(shí)例,即堆區(qū)對(duì)象的引用(指針),也可以用來(lái)保存加載方法時(shí)的幀.
  • 堆:用來(lái)存放動(dòng)態(tài)產(chǎn)生的數(shù)據(jù),比如new出來(lái)的對(duì)象.注意創(chuàng)建出來(lái)的對(duì)象只包含屬于各自的成員變量,并不包括成員方法.因?yàn)橥粋€(gè)類(lèi)的對(duì)擁有各自的成員變量,存儲(chǔ)在各自的堆中,但是他們共享該類(lèi)的方法,并不是每創(chuàng)建一個(gè)對(duì)象把成員復(fù)制一次.
  • 常量池:JVM為每個(gè)已加載的類(lèi)型維護(hù)一個(gè)常量池,常量池就是這個(gè)類(lèi)型用到的常量的一個(gè)有序集合.包括直接常量(基本類(lèi)型 String)和其他類(lèi)型 方法 字段的符號(hào)引用 池中的數(shù)據(jù)和數(shù)組一樣通過(guò)索引訪問(wèn) 由于常量池包含了一個(gè)類(lèi)型所有的其他類(lèi)型.
  • 代碼段:用來(lái)存放從硬盤(pán)上讀取的源程序代碼.
  • 數(shù)據(jù)段:用來(lái)存放static 定義的靜態(tài)成員.
    1.png

    http://blog.csdn.net/OyangYujun/article/details/41173747

java中垃圾回收機(jī)制:

  1. 垃圾回收的意義
      在C++中,對(duì)象所占的內(nèi)存在程序結(jié)束運(yùn)行之前一直被占用,在明確釋放之前不能分配給其它對(duì)象;而在Java中,當(dāng)沒(méi)有對(duì)象引用指向原先分配給某個(gè)對(duì)象的內(nèi)存時(shí),該內(nèi)存便成為垃圾。JVM的一個(gè)系統(tǒng)級(jí)線程會(huì)自動(dòng)釋放該內(nèi)存塊。垃圾回收意味著程序不再需要的對(duì)象是"無(wú)用信息",這些信息將被丟棄。當(dāng)一個(gè)對(duì)象不再被引用的時(shí)候,內(nèi)存回收它占領(lǐng)的空間,以便空間被后來(lái)的新對(duì)象使用。事實(shí)上,除了釋放沒(méi)用的對(duì)象,垃圾回收也可以清除內(nèi)存記錄碎片。由于創(chuàng)建對(duì)象和垃圾回收器釋放丟棄對(duì)象所占的內(nèi)存空間,內(nèi)存會(huì)出現(xiàn)碎片。碎片是分配給對(duì)象的內(nèi)存塊之間的空閑內(nèi)存洞。碎片整理將所占用的堆內(nèi)存移到堆的一端,JVM將整理出的內(nèi)存分配給新的對(duì)象。
      垃圾回收能自動(dòng)釋放內(nèi)存空間,減輕編程的負(fù)擔(dān)。這使Java 虛擬機(jī)具有一些優(yōu)點(diǎn)。首先,它能使編程效率提高。在沒(méi)有垃圾回收機(jī)制的時(shí)候,可能要花許多時(shí)間來(lái)解決一個(gè)難懂的存儲(chǔ)器問(wèn)題。在用Java語(yǔ)言編程的時(shí)候,靠垃圾回收機(jī)制可大大縮短時(shí)間。其次是它保護(hù)程序的完整性, 垃圾回收是Java語(yǔ)言安全性策略的一個(gè)重要部份。
      垃圾回收的一個(gè)潛在的缺點(diǎn)是它的開(kāi)銷(xiāo)影響程序性能。Java虛擬機(jī)必須追蹤運(yùn)行程序中有用的對(duì)象,而且最終釋放沒(méi)用的對(duì)象。這一個(gè)過(guò)程需要花費(fèi)處理器的時(shí)間。其次垃圾回收算法的不完備性,早先采用的某些垃圾回收算法就不能保證100%收集到所有的廢棄內(nèi)存。當(dāng)然隨著垃圾回收算法的不斷改進(jìn)以及軟硬件運(yùn)行效率的不斷提升,這些問(wèn)題都可以迎刃而解。
    垃圾回收有以下的幾個(gè)特點(diǎn):
    (1)垃圾收集發(fā)生的不可預(yù)知性:由于實(shí)現(xiàn)了不同的垃圾回收算法和采用了不同的收集機(jī)制,所以它有可能是定時(shí)發(fā)生,有可能是當(dāng)出現(xiàn)系統(tǒng)空閑CPU資源時(shí)發(fā)生,也有可能是和原始的垃圾收集一樣,等到內(nèi)存消耗出現(xiàn)極限時(shí)發(fā)生,這與垃圾收集器的選擇和具體的設(shè)置都有關(guān)系。
     ?。?)垃圾收集的精確性:主要包括2 個(gè)方面:(a)垃圾收集器能夠精確標(biāo)記活著的對(duì)象;(b)垃圾收集器能夠精確地定位對(duì)象之間的引用關(guān)系。前者是完全地回收所有廢棄對(duì)象的前提,否則就可能造成內(nèi)存泄漏。而后者則是實(shí)現(xiàn)歸并和復(fù)制等算法的必要條件。所有不可達(dá)對(duì)象都能夠可靠地得到回收,所有對(duì)象都能夠重新分配,允許對(duì)象的復(fù)制和對(duì)象內(nèi)存的縮并,這樣就有效地防止內(nèi)存的支離破碎。
      (3)現(xiàn)在有許多種不同的垃圾收集器,每種有其算法且其表現(xiàn)各異,既有當(dāng)垃圾收集開(kāi)始時(shí)就停止應(yīng)用程序的運(yùn)行,又有當(dāng)垃圾收集開(kāi)始時(shí)也允許應(yīng)用程序的線程運(yùn)行,還有在同一時(shí)間垃圾收集多線程運(yùn)行。
     ?。?)垃圾收集的實(shí)現(xiàn)和具體的JVM 以及JVM的內(nèi)存模型有非常緊密的關(guān)系。不同的JVM 可能采用不同的垃圾收集,而JVM 的內(nèi)存模型決定著該JVM可以采用哪些類(lèi)型垃圾收集?,F(xiàn)在,HotSpot 系列JVM中的內(nèi)存系統(tǒng)都采用先進(jìn)的面向?qū)ο蟮目蚣茉O(shè)計(jì),這使得該系列JVM都可以采用最先進(jìn)的垃圾收集。
     ?。?)隨著技術(shù)的發(fā)展,現(xiàn)代垃圾收集技術(shù)提供許多可選的垃圾收集器,而且在配置每種收集器的時(shí)候又可以設(shè)置不同的參數(shù),這就使得根據(jù)不同的應(yīng)用環(huán)境獲得最優(yōu)的應(yīng)用性能成為可能。

java中error和exception的區(qū)別:

Error類(lèi)和exception類(lèi)的父類(lèi)都是throwable類(lèi),他們的區(qū)別是:
error類(lèi)一般是指與虛擬機(jī)相關(guān)的問(wèn)題,如系統(tǒng)崩潰 ,虛擬機(jī)錯(cuò)誤,內(nèi)存空間不足,方法調(diào)用棧溢等.對(duì)于這類(lèi)錯(cuò)誤的導(dǎo)致的應(yīng)用程序中斷,僅靠程序無(wú)法恢復(fù)和預(yù)防,遇到這樣的錯(cuò)誤,建議讓程序終止.
Exception類(lèi)表示程序可以處理的異常,可以捕獲這類(lèi)異常,應(yīng)該盡可能處理異常,使程序恢復(fù)運(yùn)行,而不應(yīng)該隨意終止異常.
Exception類(lèi)又分為運(yùn)行時(shí)異常和受檢查的異常,運(yùn)行時(shí)異常,編譯能通過(guò)但運(yùn)行就終止了,程序不會(huì)處理運(yùn)行時(shí)異常,出現(xiàn)這類(lèi)異常,程序會(huì)終止.而受檢查的異常,要么用try...catch捕獲,要么用throws子句聲明拋出,交給他的父類(lèi)處理,否則編譯不會(huì)通過(guò).

字節(jié)流和字符流有什么區(qū)別?

程序中的輸入輸出都是以流的形式保存的,流中保存的實(shí)際上全都是字節(jié)文件。
字符流處理的單元為2個(gè)字節(jié)的Unicode字符
字符流(一個(gè)字符占兩個(gè)字節(jié))
字節(jié)流在操作的時(shí)候本身是不會(huì)用到緩沖區(qū)(內(nèi)存)的,是與文件本身直接操作的,而字符流在操作的時(shí)候是使用到緩沖區(qū)的
字節(jié)流在操作文件時(shí),即使不關(guān)閉資源(close方法),文件也能輸出,但是如果字符流不使用close方法的話,則不會(huì)輸出任何內(nèi)容,說(shuō)明字符流用的是緩沖區(qū),并且可以使用flush方法強(qiáng)制進(jìn)行刷新緩沖區(qū),這時(shí)才能在不close的情況下輸出內(nèi)容.

字符流是字節(jié)流的包裝,字符流則是直接接受字符串,它內(nèi)部將串轉(zhuǎn)成字節(jié),再寫(xiě)入底層設(shè)備,這為我們向IO設(shè)別寫(xiě)入或讀取字符串提供了一點(diǎn)點(diǎn)方便。 字符向字節(jié)轉(zhuǎn)換時(shí),要注意編碼的問(wèn)題,因?yàn)樽址D(zhuǎn)成字節(jié)數(shù)組,

==與equlas有什么區(qū)別?

==可以判斷基本數(shù)據(jù)類(lèi)型值是否相等,也可以判斷兩個(gè)對(duì)象指向的內(nèi)存地址是否相同,也就是說(shuō)判斷兩個(gè)對(duì)象是否是同一個(gè)對(duì)象,Equlas通常用來(lái)做字符串比較

攔截器與過(guò)濾器的區(qū)別?

  • 攔截器是基于java的反射機(jī)制的,而過(guò)濾器是基于函數(shù)回調(diào)。
  • 攔截器不依賴(lài)與servlet容器,過(guò)濾器依賴(lài)與servlet容器。
  • 攔截器只能對(duì)action請(qǐng)求起作用,而過(guò)濾器則可以對(duì)幾乎所有的請(qǐng)求起作用。
  • 攔截器可以訪問(wèn)action上下文、值棧里的對(duì)象,而過(guò)濾器不能訪問(wèn)。
  • 在action的生命周期中,攔截器可以多次被調(diào)用,而過(guò)濾器只能在容器初始化時(shí)被.
  • 執(zhí)行順序 :過(guò)濾前 - 攔截前 - Action處理 - 攔截后 - 過(guò)濾后
    http://964874044.iteye.com/blog/1941069

SESSION, COOKIE區(qū)別

session數(shù)據(jù)放在服務(wù)器上,cookie則放在客戶(hù)瀏覽器上。cookie不太安全,因?yàn)榭梢苑治龀霰镜豤ookie,并進(jìn)行cookie欺騙,考慮安全應(yīng)使用session。session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上,當(dāng)訪問(wèn)增多時(shí),會(huì)比較占用服務(wù)器的性能,考慮減輕服務(wù)器壓力則應(yīng)該使用cookie。單個(gè)cookie保持的數(shù)據(jù)不超過(guò)4k,很多瀏覽器都限制要給站點(diǎn)最多保存20個(gè)cookie。
http://blog.csdn.net/duan1078774504/article/details/51912868

簡(jiǎn)述Servlet中請(qǐng)求的轉(zhuǎn)發(fā)與重定向的區(qū)別.

轉(zhuǎn)發(fā):forward ,內(nèi)部請(qǐng)求轉(zhuǎn)發(fā),前一個(gè)程序進(jìn)行請(qǐng)求,后一個(gè)程序用來(lái)返回響應(yīng)

請(qǐng) 求轉(zhuǎn)發(fā)發(fā)生在服務(wù)器端,由服務(wù)器(比如servlet)控制。
請(qǐng)求轉(zhuǎn)發(fā)過(guò)程在同一個(gè)請(qǐng)求當(dāng)中完成,只會(huì)返回一個(gè)響應(yīng)。
請(qǐng)求轉(zhuǎn)發(fā)使用RequestDispatcher對(duì)象的forward()或include()方法
請(qǐng)求轉(zhuǎn)發(fā)相對(duì)快:因?yàn)檎?qǐng)求轉(zhuǎn)發(fā)過(guò)程在同一請(qǐng)求中。

重定向:redirect,服務(wù)端發(fā)送給客戶(hù)端一個(gè)重定向的臨時(shí)響應(yīng)頭,這個(gè)響應(yīng)頭包含重定向之后的url,客戶(hù)端用新的URL重新向服務(wù)器發(fā)送一個(gè)請(qǐng)求

重定向發(fā)生在客戶(hù)端,由客戶(hù)(通常是瀏覽器)控制。
重定向過(guò)程則發(fā)生在兩個(gè)不同的請(qǐng)求中,會(huì)返回兩個(gè)不同響應(yīng)。
重定向則使用HttpServletResponse對(duì)象的sendRedirect()方法。

Java 中 sleep 方法和 wait 方法的區(qū)別?

雖然兩者都是用來(lái)暫停當(dāng)前運(yùn)行的線程,但是 sleep() 實(shí)際上只是短暫停頓,因?yàn)樗粫?huì)釋放鎖,而 wait() 意味著條件等待,這就是為什么該方法要釋放鎖,因?yàn)橹挥羞@樣,其他等待的線程才能在滿(mǎn)足條件時(shí)獲取到該鎖。
https://www.cnblogs.com/bethunebtj/p/5696999.html

什么是java序列化,如何實(shí)現(xiàn)java序列化?或者請(qǐng)解釋Serializable接口的作用。

我們有時(shí)候?qū)⒁粋€(gè)java對(duì)象變成字節(jié)流的形式傳出去或者從一個(gè)字節(jié)流中恢復(fù)成一個(gè)java對(duì)象,
例如,要將java對(duì)象存儲(chǔ)到硬盤(pán)或者傳送給網(wǎng)絡(luò)上的其他計(jì)算機(jī),這個(gè)過(guò)程我們可以自己寫(xiě)代碼去把一個(gè)java對(duì)象變成某個(gè)格式的字節(jié)流再傳輸,
但是,jre本身就提供了這種支持,我們可以調(diào)用OutputStream的writeObject方法來(lái)做,如果要讓java 幫我們做,要被傳輸?shù)膶?duì)象必須實(shí)現(xiàn)serializable接口,
這樣,javac編譯時(shí)就會(huì)進(jìn)行特殊處理,編譯的類(lèi)才可以被writeObject方法操作,這就是所謂的序列化。
需要被序列化的類(lèi)必須實(shí)現(xiàn)Serializable接口,該接口是一個(gè)mini接口,其中沒(méi)有需要實(shí)現(xiàn)的方法,implements Serializable只是為了標(biāo)注該對(duì)象是可被序列化的。

例如,在web開(kāi)發(fā)中,如果對(duì)象被保存在了Session中,tomcat在重啟時(shí)要把Session對(duì)象序列化到硬盤(pán),這個(gè)對(duì)象就必須實(shí)現(xiàn)Serializable接口。
如果對(duì)象要經(jīng)過(guò)分布式系統(tǒng)進(jìn)行網(wǎng)絡(luò)傳輸或通過(guò)rmi等遠(yuǎn)程調(diào)用,這就需要在網(wǎng)絡(luò)上傳輸對(duì)象,被傳輸?shù)膶?duì)象就必須實(shí)現(xiàn)Serializable接口。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容