錯題集錦(二) -- Java專項

錯題集錦(二) – Java專項

標籤(空格分隔): 找工作


JVM的內存模型

線程共享:

  • 堆(Heap):主要存放一些對象實例
  • 方法區(Method Area / Non-Heap):用於存儲已被JVM加載的類的信息、常量、靜態變量等數據。

線程自有:

  • 程序計數器(Program Counter Register):當前線程所執行的字節碼的行號指示器。
  • 虛擬機棧(JVM Stack,也可稱作Java方法棧):主要存放基本數據類型、對象引用、returnAddress類型。
  • 本地方法區(Native Method Stack):主要爲Native方法服務。

Servlet與CGI(Common Gateway Interface)的比較

與CGI程序一樣,Servlet可以相應用戶的指令,也可以收集用戶白丹的信息並給予動態反饋。
1. 調用一個CGI程序時,服務器端就要新啓動一個進程(當用戶訪問量高的時候,就會消耗系統越多的處理時間);而Servlet充分發揮了服務器端資源並高效的利用,每次調用Servlet時並不是新啓用一個進程。
2. CGI程序不具備平臺無關性;而Servlet具備java的平臺無關性,可移植行好;
3. 傳統的技術中,一般爲二層的結構:Web服務器+數據庫服務器,當網站訪問量大的時候,無法克服CGI程序與數據庫連接時速度慢的瓶頸;而Servlet有線程池的概念,可以利用多線程的優點,在系統緩存中事先建立好若干與數據庫的連接,當需要時只需要要一個連接即可,速度快。

Servlet的生命週期

Servlet的生命週期分爲5個階段:加載、創建、初始化、處理客戶請求、卸載。

  1. 加載:容器通過類加載器使用Servlet類對應的文件加載Servlet;
  2. 創建:通過Servlet構造函數創建一個Servlet對象;
  3. 初始化:調用init方法進行初始化;
  4. 處理客戶請求:每當有一個客戶請求,容器會創建一個線程來處理用戶請求;
  5. 卸載:調用destroy方法讓Servlet自己釋放其佔用的資源。

Servlet是線程不安全的,在Servlet類中可能會定義共享的變量,在併發的多線程訪問下,不同的線程對成員變量的修改會引發錯誤。

Struts1和Struts2的對比

  1. Action類:
    • Struts1要求Action類繼承一個抽象對象;
    • Struts2的Action類可以實現一個Action接口,也可以實現其他接口;
  2. Servlet依賴:
    • Struts1 Action依賴於Servlet API;
    • Struts2 Action不依賴於容器,允許Action脫離容器單獨被測試;
  3. 線程模式:
    • Struts1 Action是單例模式並且必須是線程安全的;(單例的)
    • Struts2 Action對象爲每一個請求產生一個實例,因此沒有線程安全問題。(多例的)

AWT與Swing

  • AWT:是通過調用操作系統的native方法實現的,所以在Window系統上的AWT就是Windows風格,在Linux系統上的AWT就是XWindows風格;
  • Swing:是通過Lightweight組件,不是通過native方法實現的,所以Swing的窗口風格更加多樣化。

forward和redirect

redirect:請求重定向。客戶端行爲,本質上爲2次請求,地址欄改變,前一次請求對象消失。
forward:請求轉發。服務器行爲,地址欄不變。

new

JVM中一個字節以下的整形數據會在JVM啓動的時候加載進內存。除非用new Integer()顯式的創建對象,否則都是同一個對象。
基本數據類型int,double等比較的時候比較的是數值。

JVM配置參數含義

  • -Xmx:最大堆大小;
  • -Xms:初始堆大小;
  • -Xmn:年輕代大小;
  • -XXsurvivorRatio:年輕代中Eden區與Survivor區的大小比值;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章