[TOC]java
首先介紹下Java程序具體執行的過程:數組
程序計數器:程序計數器是指CPU中的寄存器,它保存的是==程序當前執行的指令的地址==(也能夠說保存下一條指令的所在存儲單元的地址),當CPU須要執行指令時,須要從程序計數器中獲得當前須要執行的指令所在存儲單元的地址,而後根據獲得的地址獲取到指令,在獲得指令以後,程序計數器便自動加1或者根據轉移指針獲得下一條指令的地址,如此循環,直至執行完全部的指令;多線程
注:JVM中的程序計數器並不像彙編語言中的程序計數器同樣是物理概念上的CPU寄存器,可是邏輯做用上是等同的,在JVM中多線程是經過線程輪流切換來得到CPU執行時間的,在任一具體時刻,一個CPU的內核只會執行一條線程中的指令,爲了可以使得每一個線程都在線程切換後可以恢復在切換以前的程序執行位置,每一個線程都須要有本身獨立的程序計數器,而且不能互相被幹擾,不然就會影響到程序的正常執行次序。==所以,能夠這麼說,程序計數器是每一個線程所私有的==
Java棧:Java棧是Java方法執行的內存模型,Java棧中存放的是一個個的棧幀,每一個棧幀(包括:局部變量表、操做數棧、運行時常量池(在下文中提到的方法區內)的引用、方法返回地址和一些額外的附加信息)對應一個被調用的方法,當線程執行一個方法時,就會隨之建立一個對應的棧幀,並將創建的棧幀壓棧。當方法執行完畢以後,便會將棧幀出棧;spa
注:因爲每一個線程正在執行的方法可能不一樣,所以每一個線程都會有一個本身的Java棧,互不干擾
方法區:它與堆同樣,是被線程共享的區域,存儲了每一個類的信息(包括類的名稱、方法信息、字段信息)、靜態變量、常量以及編譯器編譯後的代碼等。線程
注:在方法區中有一個很是重要的部分就是運行時常量池,它是每個類或接口的常量池的運行時表示形式,在類和接口被加載到JVM後,對應的運行時常量池就被建立出來。固然並不是Class文件常量池中的內容才能進入運行時常量池,在運行期間也可將新的常量放入運行時常量池中,好比String的intern方法。