1. 程式人生 > >Java的記憶體模型(JVM的記憶體劃分)(不看後悔,一看必懂)

Java的記憶體模型(JVM的記憶體劃分)(不看後悔,一看必懂)

執行緒共享區:堆和方法區

執行緒獨佔區:棧,本地方法區和程式計數器

:存放的是new出來的東西(物件例項),被final修飾的區域性變數.java堆是垃圾收集器管理的主要區域,因此很多時候被稱為”GC堆”,java堆還可以細分為新生代和老年代,預設的,新生代 ( Young ) 與老年代 ( Old ) 的比例的值為 1:2,新生代 ( Young ) 被細分為 Eden 和 兩個 Survivor 區域,這兩個 Survivor 區域分別被命名為 from 和 to,以示區分。預設的,Eden : from : to = 8 : 1 : 1,JVM 每次只會使用 Eden 和其中的一塊 Survivor 區域來為物件服務,所以無論什麼時候,總是有一塊 Survivor 區域是空閒著的。因此,新生代實際可用的記憶體空間為 9/10 ( 即90% )的新生代空間。如果堆中沒有記憶體來完成例項分配,並且堆無法再擴充套件時,會丟擲OutOfMemoryError

方法區:用於儲存已被虛擬機器載入的類資訊(類的版本,欄位(成員變數),方法,介面),常量,靜態變數和編譯器編譯後生成的.class檔案.當方法區無法滿足記憶體分配需求時,將丟擲OutOfMemoryError異常

棧:存放的是區域性變數

相關推薦

Java記憶體模型(JVM記憶體劃分)後悔

執行緒共享區:堆和方法區 執行緒獨佔區:棧,本地方法區和程式計數器 堆:存放的是new出來的東西(物件例項),被final修飾的區域性變數.java堆是垃圾收集器管理的主要區域,因此很多時候被稱為”

記憶體洩漏和記憶體溢位後悔

​​​​​​​記憶體洩漏 記憶體洩漏是指不再被程式使用的物件或者變數還在記憶體中佔儲存空間 記憶體洩漏主要有兩種情況:一是在堆中申請的空間沒有被釋放;二是物件已經不再使用,但仍然在記憶體中保留著,垃圾回收器則無法保證不再使用的物件會被釋放.因此java語言中的記憶

java中常見的執行緒池後悔

Executor介面表示執行緒池,它的execute(Runnable task)方法用來執行Runnable型別的任務,ExecutorService是Executor的子介面,聲明瞭管理執行緒池的一些方法 Java.util.concurrent.Executors類包含了一些靜態

hibernate相關面試題後悔

概述 hibernate框架應用在dao層,,hibernate的底層程式碼是jdbc,它是一個開源的輕量級的框架. hibernate通過orm思想對資料庫進行crud操作.orm中文翻譯過來就是物件關係對映,它讓實體類(就是通常所說的pojo)和資料庫表對應,讓實體類的欄位和表裡的欄

spring bean的單例和多例的使用場景和在單例bean中注入多例後悔

為什麼用單例或者多例?何時用? 之所以用單例,是因為沒必要每個請求都新建一個物件,這樣子既浪費CPU又浪費記憶體; 之所以用多例,是為了防止併發問題;即一個請求改變了物件的狀態,此時物件又處理另一個請求,而之前請求對物件狀態的改變導致了物件對另一個請求做了錯誤的處理;  

spring bean的生命週期和作用域後悔

bean的生命週期 生命週期執行的過程如下: 1)spring在讀取xml配置檔案時對bean進行例項化,預設bean是單例 2)spring對bean進行依賴注入 3)如果bean實現了BeanNameAware介面,spring將bean的id傳給setBeanName

Spring的IOC,DI和AOP後悔

spring的優點 ①IOC和DI降低了元件之間的耦合性 ,讓程式設計師更專注於業務邏輯 ②容器提供了眾多的輔助類,能加快應用的開發 ③spring對於主流的應用框架提供了整合支援,如hibernate,mybatis,Struts等 ④spring屬於低侵入式設計,程式碼的汙染

TCP的三次握手四次揮手後悔

三次握手 step1:第一次握手 客戶端傳送資料包到伺服器,(在此連線請求報文段中的同步位SYN=1,確認ACK=0,表示這是一個TCP連線請求資料報文,序號seq=x,表示傳輸資料時的起始序號是x)此時,客戶端進入SYN_SENT狀態,等待伺服器確認 step2:第二次握手

JSP和Servlet的區別和聯絡後悔

在引入jsp之前呢,在web應用程式中,所有的業務邏輯和HTML的響應都是在Servlet中實現的.由於業務邏輯和檢視沒有分離,系統的可擴充套件性,可讀性和可維護性都較差   jsp從表面上看,就是嵌入了java程式碼的HTML檔案;本質上jsp相當於一個Servlet.只要是

長連線是如何實現的後悔

  在HTTP1.0和HTTP1.1協議中都有對長連線的支援。其中HTTP1.0需要在request中增加”Connection: keep-alive“ header才能夠支援,而HTTP1.1預設支援.  http1.0請求與服務端的互動過程: &nbs

什麼是長連線和短連線後悔

在日常專案中,大多的時候我們用的是短連線,一個請求過來,一個執行緒處理完該請求,執行緒被執行緒池回收,這個請求就關閉了.雖然這能滿足很大部分的需求,但是也有些問題,比如說:如果客戶端發的請求比較多,比較頻繁,服務端就會忙於建立連線處理請求,由於服務端的執行緒數也有限,併發比較大的話有可能會造成服

mysql中char和varchar和text的區別後悔

①CHAR是一種固定長度的型別,適合用在身份證號碼、手機號碼等定。,VARCHAR則是一種可變長度的型別。適合用在長度可變的屬性。 text不設定長度, 當不知道屬性的最大長度時,適合用text。 ②按照查詢速度: char最快, varchar次之,text最慢。 也就是說,

ThreadLocal詳解後悔

ThreadLocal概要 我們可以使用synchorinized 關鍵字來為變數加鎖以解決執行緒安全問題,從而限制只能有一個執行緒來使用此變數,但是加鎖會大大影響程式執行效率 ThreadLocal是執行緒區域性變數(從執行緒的角度看,目標變數就像是執行緒的本地變數), 通常

如何實現自己的執行緒池後悔

首先,在服務啟動的時候,我們可以啟動好幾個執行緒,並用一個容器(如執行緒池)來管理這些執行緒。當請求到來時,可以從池中取一個執行緒出來,執行任務(通常是對請求的響應),當任務結束後,再將這個執行緒放入池中備用;如果請求到來而池中沒有空閒的執行緒,該請求需要排隊等候。最後,當服務關閉時銷燬該池即可

ThreadPoolExecutor詳解後悔

構造器引數分析 第四個構造器原始碼 corePoolSize:核心池的大小 預設情況下,在建立了執行緒池後,執行緒池中的執行緒數為0,當有任務來之後,就會建立一個執行緒去執行任務,當執行緒池中的執行緒數數目少於corePoolSize時,有新任務進來就新建一個執行緒,即使

執行緒數設多少合適後悔

①工作執行緒數是不是設定的越大越好?         回答:肯定不是的         1)一來伺服器CPU核數有限,同時併發的執行緒數是有限的,1核CPU設定10000個工作執行緒沒有意義    

談談你對CountDownLatch的理解後悔

CountDownLatch是java.util.concurrent包中一個工具類。它能夠使一個或者多個執行緒等待另外一些執行緒完成各自的工作之後,再繼續執行 使用CountDownLatch的一些情景: ①需要去解析一個Excel的資料,為了更快的解析,每個sheet都使用一個執行緒

LongAdder和AtomicLong的區別後悔

AtomicLong的原理是依靠底層的cas來保障原子性的更新資料,在要新增或者減少的時候,會使用自循(CLH)方式不斷地cas到特定的值,從而達到更新資料的目的。然而線上程競爭激烈的情況下,自循往往浪費很多計算資源才能達成預期效果。   面對自循的缺點,jdk1.8推出了Lo

什麼是GC後悔

GC就是垃圾回收,它的主要作用就是回收程式中不再使用的記憶體. 是否可以主動通知jvm進行垃圾回收? 不能實時呼叫垃圾回收器對某個物件或者所有物件進行垃圾回收.但是可以通過System.gc()方法

Minor GC和Full GC後悔

1、大多數情況下,物件在新生代Eden區中分配。當Eden區沒有足夠空間進行分配時,虛擬機器將發起一次MinorGC。 2、執行GC後,將存活的物件分配到Survivor空間 3、無法放到Survivor空間的物件,分配到老年代 4、分配到Survivor的物件,經過多