The Structure of the Java Virtual Machine(java虛擬機結構之運行時數據區翻譯)

Run-Time Data Areas (運行時數據區)

The Java Virtual Machine defines various run-time data areas that are used during execution of a program. Some of these data areas are created on Java Virtual Machine start-up and are destroyed only when the Java Virtual Machine exits. Other data areas are per thread. Per-thread data areas are created when a thread is created and destroyed when the thread exits.
譯文:Java虛擬機定義了在程序執行期間使用的各種運行時數據區域。
其中一些數據區域是在Java虛擬機啓動時創建的,只在Java虛擬機退出時銷燬,其他數據區域爲每個線程。每個線程數據區域在線程創建時創建,在線程退出時銷燬。

The pc Register (程序計數器)

The Java Virtual Machine can support many threads of execution at once (JLS §17). Each Java Virtual Machine thread has its own pc (program counter) register. At any point, each Java Virtual Machine thread is executing the code of a single method, namely the current method (§2.6) for that thread. If that method is not native, the pc register contains the address of the Java Virtual Machine instruction currently being executed. If the method currently being executed by the thread is native, the value of the Java Virtual Machine’s pc register is undefined. The Java Virtual Machine’s pc register is wide enough to hold a returnAddress or a native pointer on the specific platform.
譯文:Java虛擬機可以支持同時執行多個線程(JLS§17)。每個Java虛擬機線程都有自己的pc(程序計數器)寄存器。在任何時候,每個Java虛擬機線程都在執行單個方法的代碼,即該線程的當前方法(§2.6)。如果該方法不是本機的,則pc寄存器包含當前正在執行的Java虛擬機指令的地址。如果線程當前執行的方法是本地的,那麼Java虛擬機的pc寄存器的值是未定義的。Java虛擬機的pc寄存器足夠寬,可以在特定平臺上保存一個returnAddress或一個本機指針。

Java Virtual Machine Stacks (java虛擬機棧)

Heap(堆)

The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads. The heap is the run-time data area from which memory for all class instances and arrays is allocated.

The heap is created on virtual machine start-up. Heap storage for objects is reclaimed by an automatic storage management system (known as a garbage collector); objects are never explicitly deallocated. The Java Virtual Machine assumes no particular type of automatic storage management system, and the storage management technique may be chosen according to the implementor’s system requirements. The heap may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger heap becomes unnecessary. The memory for the heap does not need to be contiguous.

A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the heap, as well as, if the heap can be dynamically expanded or contracted, control over the maximum and minimum heap size.

The following exceptional condition is associated with the heap:

If a computation requires more heap than can be made available by the automatic storage management system, the Java Virtual Machine throws an OutOfMemoryError.
譯文:Java虛擬機有一個堆,在所有Java虛擬機線程之間共享。堆是運行時數據區域,爲所有類實例和數組分配內存。堆在虛擬機啓動時創建。對象的堆存儲由自動存儲管理系統(稱爲垃圾收集器)回收;對象永遠不會顯式地釋放,Java虛擬機假設沒有特定類型的自動存儲管理系統,存儲管理技術可以根據實施者的系統需求進行選擇。堆的大小可以是固定的,也可以根據計算的需要進行擴展,如果不必要的話,還可以收縮,堆的內存不需要是連續的。Java虛擬機實現可以讓程序員或用戶控制堆的初始大小,如果堆可以動態擴展或收縮,還可以控制堆的最大和最小大小。

下面是與堆相關的異常情況:
如果計算需要的堆比自動存儲管理系統提供的堆多,Java虛擬機會拋出OutOfMemoryError。

Method Area(方法區)

The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. The method area is analogous to the storage area for compiled code of a conventional language or analogous to the “text” segment in an operating system process. It stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the special methods (§2.9) used in class and instance initialization and interface initialization.

The method area is created on virtual machine start-up. Although the method area is logically part of the heap, simple implementations may choose not to either garbage collect or compact it. This specification does not mandate the location of the method area or the policies used to manage compiled code. The method area may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger method area becomes unnecessary. The memory for the method area does not need to be contiguous.

A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the method area, as well as, in the case of a varying-size method area, control over the maximum and minimum method area size.

The following exceptional condition is associated with the method area:

If memory in the method area cannot be made available to satisfy an allocation request, the Java Virtual Machine throws an OutOfMemoryError.
譯文:
Java虛擬機有一個在所有Java虛擬機線程之間共享的方法區域。方法區域類似於傳統語言編譯代碼的存儲區域,或類似於操作系統進程中的“文本”段。它存儲每個類的結構,比如運行時常量池、字段和方法數據,以及方法和構造函數的代碼,包括在類和實例初始化以及接口初始化中使用的特殊方法(§2.9)。
方法區域是在虛擬機啓動時創建的。雖然方法區域在邏輯上是堆的一部分,但簡單實現可能選擇不進行垃圾收集或壓縮。此規範不強制規定用於管理已編譯代碼的方法區域或策略的位置。方法區域可以是固定大小,也可以根據計算的需要進行擴展,如果不需要更大的方法區域,則可以收縮。方法區域的內存不需要是連續的。
Java虛擬機實現可以爲程序員或用戶提供對方法區域初始大小的控制,以及在方法區域大小可變的情況下,對最大和最小方法區域大小的控制。
以下異常情況與方法區域相關:
如果方法區域中的內存無法滿足分配請求,Java虛擬機將拋出OutOfMemoryError錯誤。

Run-Time Constant Pool (運行時常量池)

A run-time constant pool is a per-class or per-interface run-time representation of the constant_pool table in a class file (§4.4). It contains several kinds of constants, ranging from numeric literals known at compile-time to method and field references that must be resolved at run-time. The run-time constant pool serves a function similar to that of a symbol table for a conventional programming language, although it contains a wider range of data than a typical symbol table.

Each run-time constant pool is allocated from the Java Virtual Machine’s method area (§2.5.4). The run-time constant pool for a class or interface is constructed when the class or interface is created (§5.3) by the Java Virtual Machine.

The following exceptional condition is associated with the construction of the run-time constant pool for a class or interface:

When creating a class or interface, if the construction of the run-time constant pool requires more memory than can be made available in the method area of the Java Virtual Machine, the Java Virtual Machine throws an OutOfMemoryError.

See §5 (Loading, Linking, and Initializing) for information about the construction of the run-time constant pool.
譯文:
運行時常量池是類文件中constant_pool表的每個類或每個接口的運行時表示(§4.4)。它包含幾種類型的常量,從編譯時已知的數值文字到必須在運行時解析的方法和字段引用。運行時常量池提供的功能與傳統編程語言的符號表類似,儘管它包含的數據範圍比典型的符號表更廣。
每個運行時常量池都是從Java虛擬機的方法區分配的(§2.5.4)。類或接口的運行時常量池是在Java虛擬機創建類或接口時構建的(§5.3)。
以下異常情況與類或接口的運行時常量池的構建相關:
在創建類或接口時,如果構建運行時常量池需要的內存超過了Java虛擬機的方法區域可用的內存,那麼Java虛擬機將拋出OutOfMemoryError。
參見§5(加載、鏈接和初始化)獲取關於構建運行時常量池的信息。

Native Method Stacks(本地方法棧)

An implementation of the Java Virtual Machine may use conventional stacks, colloquially called “C stacks,” to support native methods (methods written in a language other than the Java programming language). Native method stacks may also be used by the implementation of an interpreter for the Java Virtual Machine’s instruction set in a language such as C. Java Virtual Machine implementations that cannot load native methods and that do not themselves rely on conventional stacks need not supply native method stacks. If supplied, native method stacks are typically allocated per thread when each thread is created.

This specification permits native method stacks either to be of a fixed size or to dynamically expand and contract as required by the computation. If the native method stacks are of a fixed size, the size of each native method stack may be chosen independently when that stack is created.

A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the native method stacks, as well as, in the case of varying-size native method stacks, control over the maximum and minimum method stack sizes.

The following exceptional conditions are associated with native method stacks:

If the computation in a thread requires a larger native method stack than is permitted, the Java Virtual Machine throws a StackOverflowError.

If native method stacks can be dynamically expanded and native method stack expansion is attempted but insufficient memory can be made available, or if insufficient memory can be made available to create the initial native method stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError.
譯文:
Java虛擬機的實現可以使用傳統的棧(通俗地稱爲“C棧”)來支持本地方法(用Java編程語言以外的語言編寫的方法)。本地方法棧的實現也可以使用一個翻譯爲Java虛擬機的指令集的語言如c . Java虛擬機實現,無法加載本地方法,自己不依賴傳統的本地方法棧棧不需要供應。如果提供了本機方法棧,則通常在創建每個線程時爲每個線程分配本機方法棧。
該規範允許本地方法堆棧具有固定的大小,或者根據計算的需要動態地展開和收縮。如果本機方法堆棧的大小是固定的,那麼可以在創建該堆棧時獨立選擇每個本機方法堆棧的大小。
Java虛擬機實現可以爲程序員或用戶提供對原生方法棧初始大小的控制,並且,在原生方法棧大小可變的情況下,還可以控制最大和最小方法棧大小。
下面的異常條件與本機方法棧相關聯

如果線程中的計算需要比允許的更大的本機方法堆棧,Java虛擬機將拋出StackOverflowError。
如果可以動態擴展本機方法堆棧,並且嘗試擴展本機方法堆棧,但是可用內存不足,或者如果可用內存不足,可以爲新線程創建初始本機方法堆棧,Java虛擬機將拋出OutOfMemoryError

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章