在没有任何数据时进行无效的读取尝试。_技术转载——JVM运行时内存是怎么分布的?...
寫在前面:2020年面試必備的Java后端進階面試題總結了一份復習指南在Github上,內容詳細,圖文并茂,有需要學習的朋友可以Star一下!
GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master
寄存器中的內存最小速度最快,硬盤容量最大,速度最小,cup的第三級緩存是共享內存。
對于一個在同一行的數據XY,會被同時加載進CPU,這個現象叫cache line緩存行對齊, 緩存行對齊具體內容可以看看這篇文章 如果左邊的CPU核心加載了X并進行修改,但是此時并沒有將數據寫回進主內存,或者是第三級緩存,此時右邊的CPU核心將X讀進,并修改,此時就會產生數據不一致的情況。對于左邊修改了數據右邊如何才能知道,這是硬件層級需要解決的。 多線程一致性的硬件支持有以下幾種方式。
Runtime Data Area and Instruction Set
jvms 2.4 2.5
指令集分類
Runtime Data Area
PC 程序計數器 Program Counter
Each Java Virtual Machine thread has its own pc (program counter) register.
每個Java虛擬機線程都有自己的程序計數器的存儲空間。
At any point, each Java Virtual Machine thread is executing the code of a single method, namely the current method for that thread.
在任何時候,每個Java虛擬機線程都在執行單個方法的代碼,即該線程的當前方法。
If that method is not native , the pc register contains the address of the Java Virtual Machine instruction currently being executed.
如果該方法不是本機方法,則pc寄存器包含當前正在執行的Java虛擬機指令的地址。
存放指令位置
虛擬機的運行,類似于這樣的循環:
while( not end ) {取PC中的位置,找到對應位置的指令;執行該指令;PC ++; }JVM Stack
Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at the same time as the thread.
每個Java虛擬機線程都有一個私有Java虛擬機堆棧,與該線程同時創建。
A Java Virtual Machine stack stores frames
每個Java虛擬機存儲的都是棧幀
Heap
The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads.
java 虛擬機有個所有線程共享的堆內存。
The heap is the run-time data area from which memory for all class instances and arrays is allocated.
堆是運行時數據區,從中分配所有類實例和數組的內存。
Method Area
The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads.
Java虛擬機具有一個在所有Java虛擬機線程之間共享的方法區域。
It stores per-class structures
存儲每個類的結構
Runtime Constant Pool
A run-time constant pool is a per-class or per-interface run-time representation of the constant_ pool table ina class fileNative Method Stack
An implementation of the Java Virtual Machine may use conventional stacks called native method stacksDirect Memory
JVM可以直接訪問的內核空間的內存 (OS 管理的內存) NIO , 提高效率,實現zero copy上面的內容總結起來就是下面這張圖
每個線程都有自己的棧內存,里面存放的是棧幀,如果有調用native方法就還存在native method stack,還有自己program counter程序計數器,用來記錄每條指令的執行,當CPU切換線程的時候方便知道之前線程執行到哪條指令,所有線程共享堆內存和方法區,方法區有兩種實現,在jdk8之前方法區叫PermGen永久代,jdk8及其以后的版本都叫Meta Space 元數據區。
棧幀:A frame is used to store data and partial results, as well as to perform dynamic linking, return values for methods, and dispatch exceptions.
棧幀是用來存儲數據部分結果,和執行動態鏈接,返回方法的值和處理異常調度。
我們看一下一個簡單的方法的執行過程的棧幀是怎么樣的。
pubilc class Test1{pubilc static void main(String [] args){Test h = new Test();h.m1();} }pubilc class Test{public void m1(){int i = 200;} }編譯后的Test1字節碼為:
0 new #2 <com/yhx/Test> 3 dup 4 invokespcial #3<com/yhx/Test<init>> 7 istore_1 8 iload_1 9 invokespcial #3<com/yhx/Test<m1>> 12 return對應Test字節碼為:
0 ipush 200 3 istore_1 4 return我我們看一下執行過程,在含有主方法的字節碼中,首先執行一個new指令。new一個對象的話,包括三個操作:
我們看上面指令,在這條 invokespcial #3<com/yhx/Test>也就是初始化之前執行了一個dup指令,也就是上面初始化對象的是哪個流程執行完第二個流程,此時這個對象的成員變量的值如果是引用型的則還是為null,這個dup指令是將main方法棧幀中Operand Stacks的(如上圖)h復制一份,然后出棧,init操作拿著出棧后的值進行初始化操作,這個時候棧內的對象引用就變為初始化之后的了。 接下來就是“istore_1”變量1就是h,將初始化好的內存引用賦值給h,然后“iload_1”把變量1加載進本地變量表。
來源:https://www.tuicool.com/articles/YZnYZvI總結
以上是生活随笔為你收集整理的在没有任何数据时进行无效的读取尝试。_技术转载——JVM运行时内存是怎么分布的?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql文字字符集_MySQL字符集
- 下一篇: 织梦栏目mysql调用_织梦dedecm