1. 程式人生 > >java記憶體區域和記憶體溢位異常--->171224

java記憶體區域和記憶體溢位異常--->171224

今天是西方的平安夜,沒有過節的任何感覺,我想盡快的把Java、演算法、os、網路的知識複習一遍,從而在年前找到一個不錯的實習。大概不到兩個月的時間就過年,所以時間很是緊迫,我計劃準備10天,然後投開始簡歷,畢竟該忘的都忘了,不該忘的也給忘了,上次去面試就因為什麼都沒有準備,在演算法方面被虐的夠夠的,最長公共子序列和雜湊演算法還有演算法複雜度的計算,目前待解決。

今天的工作大部分放在了排序演算法上,冒泡和快排、插入和希爾、選擇和堆排序等,大部分內容寫在了筆記本上,不在提及。下面總結一下Java虛擬機器裡的一些基本內容,主要指的是Java記憶體區域和記憶體溢位異常方面的內容。還有歸併排序和快排的帶有0區的沒有搞定,計劃把王道資料結構上的非選擇題搞一遍!

Java虛擬機器所管理的記憶體包括以下幾個執行時的資料區域:程式計數器(PC)、堆、虛擬機器棧、本地方法棧、方法區等。

1、程式計數器是一塊較小的記憶體空間,可以看作是當前執行緒所執行位元組碼的行號指示器,在虛擬機器的概念模型中,位元組碼直譯器工作時就是通過改變程式計數器的值來選取下一條需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個計數器來完成。

在任何一個確定的時刻,一個處理器都只會執行一個執行緒中的指令。因此,為了執行緒切換後能恢復到正確的位置,每條執行緒都需要一個獨立的程式計數器,且之間相互不影響,獨立儲存,我們稱這類記憶體區域為“執行緒私有”的記憶體。如果一個執行緒正在執行一個Java方法,這個計數器記錄的是正在執行的虛擬機器位元組碼指令的地址

;如果正在執行的是Native方法,這個計數器則為空(Undefined)。

這個區域在Java虛擬機器規範中唯一的沒有規定任何OutOfMemoryError異常的區域。

2、Java虛擬機器棧

java虛擬機器棧也是執行緒私有的,它的生命週期與執行緒相同。虛擬機器棧描述的是java方法執行的記憶體模型:每個方法在執行的同時都會建立一個棧幀(Stack Frame),用於儲存區域性變量表運算元棧動態連結方法出口等資訊。方法呼叫---棧幀入棧,方法執行完成---出棧。

平常所說java記憶體分為的堆記憶體和棧記憶體(這種劃分很粗糙),這兩塊是與物件記憶體分配關係最密切記憶體區域。這裡所說的

就是java虛擬機器棧或者說是虛擬機器棧中區域性變量表部分。

區域性變量表存放了編譯期可知的各種基本資料型別、物件引用(控制代碼和引用有什麼關係?)、returnAddress型別(指向了一條位元組碼指令的地址)。區域性變量表所需的記憶體空間在編譯期間完成分配,當進入一個方法時,這個方法需要在幀中分配多大的區域性變數空間是確定的,在方法執行期間不會改變區域性變量表的大小。

在這個區域規定了兩種異常:StackOverflowError(執行緒請求的棧深度大於虛擬機器所允許的深度——>可以動態擴充套件)、OutOfMemoryError(擴充套件時無法申請到足夠的記憶體)。

3、本地方法棧:

與java虛擬機器棧作用相似,區別在於:虛擬機器棧為虛擬機器執行的java方法(也就是位元組碼)服務,而本地方法棧則為虛擬機器使用的Native方法服務。此處區域所允許的異常和java虛擬機器一樣:StackOverflowError(執行緒請求的棧深度大於虛擬機器所允許的深度——>可以動態擴充套件)、OutOfMemoryError(擴充套件時無法申請到足夠的記憶體)。也是執行緒私有的。

綜上,執行緒隔離資料區,也就是執行緒私有的記憶體區域:程式計數器、java虛擬機器棧、本地方法棧。

4、java堆

是java虛擬機器所管理的最大的記憶體塊。java堆是被所有執行緒所共享的一塊記憶體區域,在虛擬機器啟動的時候建立。用於存放幾乎所有的物件例項。java虛擬機器規範描述的是:所有的物件例項以及陣列都要在堆上分配。(JIT編譯器、逃逸分析技術、棧上分配、標量替換優化技術使得不在“絕對”)

java堆是垃圾收集器管理的主要區域,也被稱為“GC堆”。當然,可以根據記憶體回收或者記憶體分配還可以更細緻的對堆進行劃分!

根據java虛擬機器規範,java堆可以處於物理上不連續但邏輯上連續的記憶體。實現時,既可以是固定的也可以是可擴充套件的。如果在堆中沒有記憶體完成例項分配,並且堆也無法再擴充套件時,將會丟擲OutOfmemoryError異常。

5、方法區

它是執行緒共享的記憶體區域,用於儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。待續。。。

參考:《深入理解Java虛擬機器:JVM。。。》

相關推薦

java記憶體區域記憶體溢位異常--->171224

今天是西方的平安夜,沒有過節的任何感覺,我想盡快的把Java、演算法、os、網路的知識複習一遍,從而在年前找到一個不錯的實習。大概不到兩個月的時間就過年,所以時間很是緊迫,我計劃準備10天,然後投開始簡歷,畢竟該忘的都忘了,不該忘的也給忘了,上次去面試就因為什麼都沒有準備,

Java記憶體區域記憶體溢位異常

Java執行時記憶體區域Java虛擬機器在執行Java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。如圖2-1所示 程式計數器(Program Counter Register):程式計數器是一塊較小的記憶體空間。它可以看作是當前執行緒所執行的位元組碼的行號指示

JAVA 記憶體區域記憶體溢位異常

一、執行時資料區域 概念: JAVA虛擬機器在執行JAVA程式的過程中會把它管理的記憶體劃分若干個不同的資料區域。有著各自的用途,以及建立和銷燬時間。 資料區域: 1) 程式計數器 A、當前執行緒所執行的位元組碼行號指示器。位元組碼直譯器工作時就是通過改變這個計數器的值來

Java記憶體區域記憶體模型

JVM的記憶體區域劃分由於Java程式是交由JVM執行的,所以我們在談Java記憶體區域劃分的時候事實上是指JVM記憶體區域劃分。在討論JVM記憶體區域劃分之前,先來看一下Java程式具體執行的過程:如上圖所示,首先Java原始碼檔案(.java字尾)會被Java編譯器編譯為

JVM記憶體管理:記憶體區域記憶體洩漏

VM執行時資料區域 JVM執行Java程式的過程中,會使用到各種資料區域,這些區域有各自的用途、建立和銷燬時間。根據《Java虛擬機器規範(第二版)》(下文稱VM Spec)的規定,JVM包括下列幾個執行時資料區域: 1.程式計數器(Program Counter Register): 每一個Java執

JVM面試題整理-Java記憶體區域記憶體溢位異常、垃圾收集器記憶體分配策略

1、Java虛擬機器記憶體(執行時資料區域)的劃分,每個區域的功能 關於JVM 執行時記憶體劃分的例項參考: http://www.cnblogs.com/hellocsl/p/3969768.html?utm_source=tuicool&

學習筆記1:深入理解Java虛擬機器——JVM高階特性與最佳實踐_走進java_java記憶體區域記憶體溢位異常

第一部分:走進java Java虛擬機器 程式碼在華章下載 jdk釋出了六個命令列工具和兩個視覺化故障處理工具。 推薦書籍 設計原本 領域特定語言 現在著名的Java虛擬機器 hotspot vm(預設) jrockit vm j9 vm jdk sun jdk op

java虛擬機器—-java記憶體區域記憶體溢位異常

一,java虛擬機器所管理的執行時資料區域分為:程式計數器、java虛擬機器棧、本地方法棧、java堆、方法區、執行時常量池。                     1,程式計數器:

《深入理解Java虛擬機器—JVM高階特性與實踐 周志明 著》之第2章 Java記憶體區域記憶體溢位異常

1、Java虛擬機器所管理的記憶體包括以下幾個執行時資料區域: 2、程式計數器:          1. 可以看作是當前執行緒所執行的位元組碼的行號指示器,是一塊較小的記憶體空間;  &nbs

JAVA虛擬機器(JVM)劃重點 第二章 Java記憶體區域記憶體溢位異常 之 虛擬機器物件

本部落格參考《深入理解Java虛擬機器》(第二版)一書,提取重點知識,再加以個人的理解編寫而成。轉載請標明來源。 JAVA虛擬機器(JVM)劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 虛擬機器物件 Java物件的建立 1、類載入過程

JAVA虛擬機器(JVM)劃重點 第二章 Java記憶體區域記憶體溢位異常 之 執行時資料區域

本部落格參考《深入理解Java虛擬機器》(第二版)一書,提取重點知識,再加以個人的理解編寫而成。轉載請標明來源。 JVM劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 執行時資料區域 概述 執行時資料區域 程式計數器 Java虛擬機

【夾娃系列】java面試基礎知識儲備(¥2)——JVM記憶體劃分記憶體溢位異常的原因解決方法

JVM記憶體劃分和記憶體溢位 JVM記憶體劃分 記憶體溢位的異常和解決辦法 JVM記憶體劃分 堆:存放物件例項,被所有的執行緒共享的一塊區域。垃圾收集器管理的主要區域。 方法區:儲存虛擬機器載入的類資訊,常量,靜態變

《深入理解java虛擬機器》讀書筆記(二)---- Java記憶體區域記憶體溢位異常

執行時資料區域 java虛擬機器所管理的記憶體將會包括以下幾個執行時資料區域: 1、程式計數器 程式計數器是一塊較小的記憶體空間,它可以看作是當前執行緒所執行位元組碼的行號指示器。在虛擬機器的概念模型裡,位元組碼直譯器的工作就是通過改變這個計數器的值來選取下一條需要執

虛擬機器學習之一:java記憶體區域記憶體溢位異常

1.執行時資料區域 java虛擬機器在執行java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。這些區域都有各自的用途和建立、銷燬時間,有的區域伴隨虛擬機器程序的啟動而存在,有些區域則依賴使用者執行緒的啟動和結束而建立和銷燬。 1.1程式計數器 程式計數器

java記憶體區域記憶體溢位異常

執行是記憶體區域 java虛擬機器在執行java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。 1.執行緒獨有的記憶體區域 (1)程式計數器(Program Counter Register) 這塊記憶體區域很小,它是當前執行緒所執行的位元組碼的行號

Java 記憶體區域記憶體溢位異常(二)

一、虛擬機器中Java物件的建立 語言層面上,建立Java物件通常僅僅是一個new關鍵字而已。 在虛擬遇到new指令時: 1、首先檢查這個指令的引數是否能在常量池中定位到一個類的符號引用,並檢查這個類的符號引用代表的類是否已經載入,解析和初始化過。如果沒有,則必須執行類

Java 記憶體區域記憶體溢位異常(三)

實戰:OutOfMemoryError 異常 參考:《深入理解Java虛擬機器》-jvm高階特性與最佳實現(周志明著) 之前的兩篇中介紹Java虛擬機器中各個執行時記憶體區域的作用,這節中通過人為異常的方式驗證各個執行時區儲存的內容 一、Java堆溢位 Java堆中用

Java記憶體區域記憶體溢位異常簡單總結

目錄 1.簡述 2.作用 3.注意 1.簡介 3.異常 1.簡述 1. 簡述 2.異常 1.簡述 2.異常 1.JVM執行時資料區域簡圖 Java虛擬機器執行時資料區 2.程式計數器(Program Co

深入理解java虛擬機器---java記憶體區域記憶體溢位異常---3垃圾回收機制GC

  一、垃圾回收---物件存活演算法:     1、引用計數器法:在物件身上放上一個計數器,當有引用則加一,引用失效則減一,為零則可回收。(無法解決物件相互引用)     2、可達性分析法(java),GC roots為起始點,從節點向下搜尋,搜尋路徑為引用鏈,不在引用鏈的物件則是可回收的物件

(一)JAVA記憶體區域記憶體溢位異常

目錄 0、前沿 1、概述 2、執行時資料區域 2.1、程式計數器 2.2、JAVA虛擬機器棧 2.3、本地方法棧 2.4、JAVA堆 2.5、方法區 2.5.1、執行時常量池 3、HotSpot虛擬機器 3.1、物件的建立 3.2、物件的記憶體佈局