JAVA基础驿站,Java基础:内存模型
在java基礎當中,有很重要一塊的內容,就是關于java當中的內存模型,所涉及的問題無非就是關于java當中的類、實例、變量、常量、靜態變量、方法等blabla的東西都分別存儲在什么地方。這部分的內容雖然繁瑣,但是也是面試當中經常涉及詢問的部分,今天就在這里總結一下java當中的內存模型。
首先我們來看一下java的內存模型大體分為了幾個部分:
從圖片當中可以看到,java運行是的內存模型,大體分為了五個部分:1.方法區(靜態區)、2.虛擬機棧、3.本地方法棧、4.堆、5.程序計數器,在每一個不同的部分,分別存儲著java運行當中不一樣的信息,接下來將分類舉例;
1.方法區(又稱為靜態區,也是GC機制當中的永久帶)
1)是被線程共享的一個區域。
2)存儲虛擬機加載的類的相關信息,如class、以及static變量、方法信息(包括方法名、參數、返回類型)、域信息等。
3)方法區還包含了常量池,常量池中存儲了如字符串、final變量值、類名和方法名常量。
2.虛擬機棧(又稱java棧)
1)是一個線程隔離的區域,即私有的,其他線程無法訪問的、
2)每個線程創建的時候,jvm就會創建一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中 。
3)每個方法執行時都會創建一個棧幀用于存儲局部變量表,一個棧區包含多個棧幀,當方法執行的時候生成的棧幀會對應入棧,當方法返回的時候,棧幀將被彈出
4)棧分為3個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)。
優點:存取速度比堆要快,僅次于直接位于CPU的寄存器。
缺點:必須確定的是存在stack中的數據大小與生存期必須是確定的,缺乏靈活性。
3.堆
1)是被線程共享的一個區域
2)存儲的全部是對象,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)
優點:堆的優勢是可以動態的分配內存大小,生存期也不必事先告訴編譯器,java的垃圾收集器會自動收取這些不在使用的數據,
缺點:由于要在運行時動態分配內存,存取速度慢。
4.程序計數器
由于Java是支持多線程執行的,所以程序執行的軌跡不可能一直都是線性執行。當有多個線程交叉執行時,被中斷的線程的程序當前執行到哪條內存地址必然要保存下來,以便用于被中斷的線程恢復執行時再按照被中斷時的指令地址繼續執行下去。為了線程切換后能恢復到正確的執行位置,每個線程都需要有一個獨立的程序計數器,各個線程之間計數器互不影響,獨立存儲,我們稱這類內存區域為“線程私有”的內存,這在某種程度上有點類似于“ThreadLocal”,是線程安全的。
5.本地方法棧
本地方法棧和Java棧所發揮的作用非常相似,區別不過是Java棧為JVM執行Java方法服務,而本地方法棧為JVM執行Native方法服務。本地方法棧也會拋出StackOverflowError和OutOfMemoryError異常。
(這里也只是拋出了個概念,并沒有涉及到這部分的使用,所以我也不是很清楚它是干嘛的)
總結
以上是生活随笔為你收集整理的JAVA基础驿站,Java基础:内存模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R:ggplot2数据可视化——基础知识
- 下一篇: oracle nowday,Java M