-
在瀏覽器輸入URL,按下回車之后的流程?
DNS域名解析,得到IP地址
解析出IP地址后,根據IP地址和默認端口80和服務器建立連接
瀏覽器發出讀取文件(URL中域名后邊部分對應的文件)的HTTP請求,該請求報文作為TCP三次握手的第三個報文的數據發送給服務器
服務器對瀏覽器的請求作出響應,並把對應的html文本發送給瀏覽器
釋放TCP連接(四次揮手斷開連接)
瀏覽器解析該HTML文本並顯示內容
-
說一下Java的內存模型
Java內存模型(JMM)規定了所有的變量都存儲在主內存中(類比操作系統的主內存)。每條線程還有自己的工作內存(類比前面講的處理器高速緩存),線程的工作內存中保存了主內存的變量副本,線程對變量的所有操作都必須在工作內存中進行,而不能直接讀寫主內存中的數據
JMM最重要的3點內容分別是重排序、內存可見性、原子性。
-
Java的內存結構
-
什么是棧幀
每一次函數的調用,都會在調用棧(call stack)上維護一個獨立的棧幀(stack frame).每個獨立的棧幀一般包括:
- 函數的返回地址和參數
- 臨時變量: 包括函數的非靜態局部變量以及編譯器自動生成的其他臨時變量
- 函數調用的上下文
-
什么是索引
索引可以大大提高MySQL的檢索速度
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。
實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。
雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。建立索引會占用磁盤空間的索引文件
-
Innodb對比其他數據庫引擎的優勢是什么
InnoDB給MySQL提供了具有提交、回滾和崩潰恢復能力的事物安全(ACID兼容)存儲引擎
nnoDB是為處理巨大數據量的最大性能設計。它的CPU效率可能是任何其他基於磁盤的關系型數據庫引擎鎖不能匹敵的
InnoDB支持外鍵完整性約束
InnoDB被用在眾多需要高性能的大型數據庫站點上
主鍵盡可能小.包括索引
盡量避免全表掃描.因為會造成表鎖
盡量緩存所有的數據和索引,提高響應速度, -
myisam引擎
1.mysql默認引擎,不支持事務*
2.表級鎖定,更新時,鎖定機制是整張表被鎖定,其它連接無法更新表的數據,效率比較低下.鎖的機制成本很少,但大大降低了並發性能*
3.讀寫互相阻塞,寫的時候阻塞讀,讀的時候也阻塞寫,但讀與讀之間不阻塞*
4.只對索引進行緩存,雖然key_buffer可以大幅提高性能,減少磁盤IO,但對數據不緩存
5.適合讀業務比較多的生產環境,比如BLOG等,讀的速度比較快.
6.占用資源比較少.服務器硬件不好時.可以考慮使用
7.數據恢復沒有innodb引擎恢復的完美
8.支持全文索引,不支持外鍵約束1.盡量索引,緩存機制
調整讀寫優先級
啟用延遲插入.
生產環境應用memcache緩存的多.Mysql本身的緩存為用少 -
了解JVM嗎?說一下.class文件加載過程。
(1) Loading:把class采用雙親委派機制load到內存中,也就是把class文件中的字節裝載到內存上。
(2) Linking:
Linking過程中又分為以下三步:
a. Verification:檢驗文件類型,class的魔數是CAFEBABE,如果是其他的格式就會被剔除掉, 不進入下一階段。
b. Preparation:為靜態變量賦默認值。
c. Resolution:將類、方法、屬性等符號引用解析為直接引用;將class文件中常量池中的符號 引用解析為指針、偏移量等內存地址的直接引用。
(3) Initializing:靜態變量賦初始值,也是在這個階段調用靜態代碼塊。
-
說一下Java堆,新生代是怎么轉化為老年代的?
Java堆 = 老年代 + 新生代
新生代 = Eden + S0 + S1
當 Eden 區的空間滿了, Java虛擬機會觸發一次 Minor GC,以收集新生代的垃圾,存活下來的對象,則會轉移到 Survivor區。
大對象(需要大量連續內存空間的Java對象,如那種很長的字符串)直接進入老年態;
如果對象在Eden出生,並經過第一次Minor GC后仍然存活,並且被Survivor容納的話,年齡設為1,每熬過一次Minor GC,年齡+1,若年齡超過一定限制(15),則被晉升到老年態。即長期存活的對象進入老年態。
老年代滿了而無法容納更多的對象,Minor GC 之后通常就會進行Full GC,Full GC 清理整個內存堆 – 包括年輕代和年老代。
Major GC 發生在老年代的GC,清理老年區,經常會伴隨至少一次Minor GC,比Minor GC慢10倍以上。
-
什么情況下會發生棧內存溢出
棧是線程私有的,他的生命周期與線程相同,每個方法在執行的時候都會創建一個棧幀,用來存儲局部變量表,操作數棧,動態鏈接,方法出口等信息。局部變量表又包含基本數據類型,對象引用類型
如果線程請求的棧深度大於虛擬機所允許的最大深度,將拋出StackOverflowError異常,方法遞歸調用產生這種結果。
如果Java虛擬機棧可以動態擴展,並且擴展的動作已經嘗試過,但是無法申請到足夠的內存去完成擴展,或者在新建立線程的時候沒有足夠的內存去創建對應的虛擬機棧,那么Java虛擬機將拋出一個OutOfMemory 異常。(線程啟動過多)
-
垃圾收集器
CMS(Concurrent Mark Sweep) 收集器: 是一種以獲得最短回收停頓時間為目標的收集器,標記清除算法,運作過程:初始標記,並發標記,重新標記,並發清除,收集結束會產生大量空間碎片。
G1收集器: 標記整理算法實現,運作流程主要包括以下:初始標記,並發標記,最終標記,篩選標記。不會產生空間碎片,可以精確地控制停頓。
-
怎么判斷一個Object需要回收
- 引用計數算法
- 可達性分析算法(Java使用的這一種)
引用計數算法是在對象中加入一個計數器,當對象被引用,計數器+1,當引用失效,計數器-1這種算法實現簡單,效率高,但是有一個嚴重的問題會導致內存泄漏,那就是對象之間循環引用,比如說A對象持有B對象的引用,B對象持有A對象的引用,那么A和B的計數器值永遠>=1,也就是說這兩個對象永遠不會被回收
可達性分析算法,Java中定義了一些起始點,稱為GC Root,當有對象引用它的時候,就把對象掛載在它下面,形成一個樹狀結構,當一個對象處於一個這樣的樹里時,就認為此對象是可達的,反之是不可達,
如圖 Object1,Object2,Object3是對象可達的,Object4,Object5,Object6是不可達的
那么有哪些可以作為GC Root呢?
靜態屬性(被static修飾的屬性)
常量(被static final修飾的屬性)
虛擬機棧(本地變量表)中引用的對象
本地方法棧中引用的對象 -
多線程,怎么解決死鎖?
所謂死鎖是指多個線程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些進程都將無法向前推進。
解決:
- 加鎖順序(線程按照一定的順序加鎖)
- 加鎖時限(線程嘗試獲取鎖的時候加上一定的時限,超過時限則放棄對該鎖的請求,並釋放自己占有的鎖)
- 死鎖檢測
-
進程間的通信方式
管道( pipe ):
管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。
有名管道 (namedpipe) :
有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。
信號量(semophore ) :
信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
消息隊列( messagequeue ) :
消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺點。
信號 (sinal ) :
信號是一種比較復雜的通信方式,用於通知接收進程某個事件已經發生。
共享內存(shared memory ) :
共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號兩,配合使用,來實現進程間的同步和通信。
套接字(socket ) :
套接口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同設備及其間的進程通信。 -
線程間的通信方式
鎖機制:包括互斥鎖、條件變量、讀寫鎖
互斥鎖提供了以排他方式防止數據結構被並發修改的方法。
讀寫鎖允許多個線程同時讀共享數據,而對寫操作是互斥的。
條件變量可以以原子的方式阻塞進程,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變量始終與互斥鎖一起使用。
信號量機制(Semaphore):包括無名線程信號量和命名線程信號量
信號機制(Signal):類似進程間的信號處理
線程間的通信目的主要是用於線程同步,所以線程沒有像進程通信中的用於數據交換的通信機制。 -
HTML常用標簽
<div>、<a>、<img>、<h1>-<h6>、<p>、<table>、<form>、<ul>、<ol>、<dl>