国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JVM - 運行時數(shù)據(jù)區(qū)域

這篇具有很好參考價值的文章主要介紹了JVM - 運行時數(shù)據(jù)區(qū)域。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

程序計數(shù)器

并發(fā)情況下,會發(fā)生線程之間的上下文切換,當(dāng) 線程1 的CPU時間片用完后,需要程序計數(shù)器記錄 線程1 的下一條JVM指令的地址,等下一次 線程1 繼續(xù)運行的時,才能從正確的位置開始繼續(xù)執(zhí)行

程序計數(shù)器是線程私有的 , 既 一個線程計數(shù)器 記錄一個 線程 的指令位置

而且程序計數(shù)器是運行時數(shù)據(jù)區(qū)域唯一一個不存在內(nèi)存溢出的區(qū)域

線程是什么?實際上可以理解為線程就是一個棧

線程調(diào)用方法 就是復(fù)制方法入棧的過程

方法入棧后就會形成棧幀

比如下面的一段代碼

public class JvmDemo {
    public static void main(String[] args) {
        System.out.println("開始");
        func();
        System.out.println("結(jié)束");
    }  
    public static void func(){
    }   
}

執(zhí)行該程序會創(chuàng)建一個主線程,然后main方法入棧,示意圖如下

JVM - 運行時數(shù)據(jù)區(qū)域,JVM,jvm,java
接著mian方法執(zhí)行到 func(); ,就會復(fù)制一份 func 方法入棧,如下

JVM - 運行時數(shù)據(jù)區(qū)域,JVM,jvm,java
func方法執(zhí)行完后出棧,如下

JVM - 運行時數(shù)據(jù)區(qū)域,JVM,jvm,java
最后mian方法再出棧

我們說線程可以簡單的認(rèn)為就是棧,所以也很明顯,棧是線程私有的

棧的容量有限,如果我們不斷調(diào)用方法入棧,就會導(dǎo)致棧溢出 ( 比如遞歸時沒有遞歸出口 )

棧分為 虛擬機(jī)棧本地方法棧

可以簡單理解為 :
-入棧的方法由 java 語言編寫 的為虛擬機(jī)棧
-入棧的方法由 C語言編寫 的為本地方法棧

Object類中有很多本地方法,比如反射中用到的 public final native Class<?> getClass(); ,添加了native 關(guān)鍵字,使用C語言編寫,為了能直接對接操作系統(tǒng)

關(guān)于棧的幾個問題:

  1. 垃圾回收是否涉及棧內(nèi)存? 不涉及 ,因為棧幀執(zhí)行完就會自動出棧,無需垃圾回收
  2. 棧內(nèi)存是否分配越大越好嗎?錯誤 ,物理內(nèi)存大小一定,棧內(nèi)存越大,能同時純在的棧就會越少,既 線程數(shù)會越少
  3. 方法內(nèi)的局部變量是否是線程安全的? 是線程安全的,線程調(diào)用方法是復(fù)制方法入棧,所以每個線程都有自己的方法副本,也就有了自己的局部變量副本,所以在操作時,不會受到其他線程的干擾

堆 – 存儲對象實例

比如下面代碼

public class JvmDemo {
    public static void main(String[] args) {
        Person person = new Person();
    }
}

class Person{}

其在內(nèi)存中的模型如下
JVM - 運行時數(shù)據(jù)區(qū)域,JVM,jvm,java
person引用存在main方法的棧幀中,而person實例對象存在于堆區(qū)中

堆區(qū)是所有線程共享的 ,比如

public class JvmDemo {
    public static void main(String[] args) {
        Person person = new Person();
        Thread thread01=new Thread(()->{
            Person person01 = new Person();
        });
        thread01.start();
    }
}

class Person{}

則內(nèi)存模型如下,為了突出重點,省略 thread01 引用和實例對象 在內(nèi)存中的展示,以及 thread01.start(); 的調(diào)用過程
JVM - 運行時數(shù)據(jù)區(qū)域,JVM,jvm,java
堆的內(nèi)存有限,不能無限創(chuàng)建對象實例,否者會堆內(nèi)存溢出

因此JVM存在堆區(qū)的垃圾回收機(jī)制,清除垃圾對象,垃圾對象 可以簡單定義為沒有引用指向的實例對象

比如

Person person = new Person;
person = new Person;

此時就沒有引用指向第一個new出來的對象,那么它就會被垃圾回收

存在堆區(qū)中的對象實例是線程間共享的,對象中的 全局變量 需要考慮線程安全問題

比如

public class JvmDemo {
    public static void main(String[] args) throws InterruptedException {
        Person person = new Person();
        Thread thread01=new Thread(()->{
            for (int i=0;i<100000;i++){
                person.money++;
            }
        });
        thread01.start();
        for (int i=0;i<100000;i++){
            person.money++;
        }
        thread01.join();
        System.out.println(person.money);
    }
}
class Person{
    public int money=0;
}

輸出的結(jié)果不一定是200000
JVM - 運行時數(shù)據(jù)區(qū)域,JVM,jvm,java

方法區(qū)

方法區(qū) – 存儲 類信息靜態(tài)變量、方法

在 jdk 1.8之前,方法區(qū)存在于JVM內(nèi)存中,其實現(xiàn)方法被稱為 永久代;jdk 1.8及之后,方法區(qū)從JVM內(nèi)存移出到本地內(nèi)存,其實現(xiàn)方法被稱為 元空間

方法區(qū)是線程共享的,因此多個線程修改同一個類的靜態(tài)變量的時候同樣存在線程安全問題,比如

public class JvmDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread thread01=new Thread(()->{
            for (int i=0;i<100000;i++){
                Person.money++;
            }
        });
        thread01.start();
        for (int i=0;i<100000;i++){
            Person.money++;
        }
        thread01.join();
        System.out.println(Person.money);
    }
}
class Person{
    public static int money=0;
}

輸出結(jié)果同樣不一定是200000,此處建議先學(xué)習(xí)一下什么是靜態(tài)變量

方法區(qū)同樣存在內(nèi)存溢出的問題

知識延申 – 字符串常量池

JVM中還有一個特殊又重要的區(qū)域,就是 字符串常量池(StringTable),可以參考我的另外一篇博客

【Java 基礎(chǔ)】你真的會用 String 嗎?文章來源地址http://www.zghlxwxcb.cn/news/detail-605367.html

到了這里,關(guān)于JVM - 運行時數(shù)據(jù)區(qū)域的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • JVM運行時數(shù)據(jù)區(qū)——堆內(nèi)的區(qū)域分布

    JVM運行時數(shù)據(jù)區(qū)——堆內(nèi)的區(qū)域分布

    1.堆內(nèi)的區(qū)域分布 堆是運行時數(shù)據(jù)區(qū) 最大 的一塊區(qū)域, 主要用來存放對象 ,堆是所有 線程公用 的,在JVM 啟動時就被創(chuàng)建 ,堆的 空間是可以調(diào)整 的,是GC(垃圾回收)的 重點區(qū)域 。 堆的內(nèi)存空間分區(qū):新生代+老年代 新生代又分為Eden(伊甸園)和Survivor(幸存者)區(qū)。 ?

    2024年02月16日
    瀏覽(16)
  • 【jvm系列-05】精通運行時數(shù)據(jù)區(qū)共享區(qū)域---方法區(qū)

    【jvm系列-05】精通運行時數(shù)據(jù)區(qū)共享區(qū)域---方法區(qū)

    JVM系列整體欄目 內(nèi)容 鏈接地址 【一】初識虛擬機(jī)與java虛擬機(jī) https://blog.csdn.net/zhenghuishengq/article/details/129544460 【二】jvm的類加載子系統(tǒng)以及jclasslib的基本使用 https://blog.csdn.net/zhenghuishengq/article/details/129610963 【三】運行時私有區(qū)域之虛擬機(jī)棧、程序計數(shù)器、本地方法棧 https

    2023年04月09日
    瀏覽(23)
  • 【Jvm】運行時數(shù)據(jù)區(qū)域(Runtime Data Area)原理及應(yīng)用場景

    【Jvm】運行時數(shù)據(jù)區(qū)域(Runtime Data Area)原理及應(yīng)用場景

    Jvm由 4個部分 組成,分為2個子系統(tǒng)和2個組件 ,2個子系統(tǒng)為 Class loader(類裝載)、Execution engine(執(zhí)行引擎) ;2個組件為 Runtime Data Area(運行時數(shù)據(jù)區(qū))、Native Interface(本地接口) 。 Class loader(類加載器) :根據(jù)給定的全限定名類名(如:Java.lang.Object)來裝載class文件到Runtime data area中的

    2024年02月20日
    瀏覽(20)
  • JVM運行時區(qū)域——對象創(chuàng)建內(nèi)存分配過程

    JVM運行時區(qū)域——對象創(chuàng)建內(nèi)存分配過程

    ????????新創(chuàng)建的對象 , 都存放在伊甸園區(qū)域 ,當(dāng)垃圾回收時,將伊甸園區(qū)域的垃圾數(shù)據(jù)銷毀,然后將存活的對象轉(zhuǎn)移到幸存者0區(qū)域,之后創(chuàng)建的新的對象還是存放在伊甸園區(qū)域,等到再次垃圾回收后,將伊甸園區(qū)域和幸存者0區(qū)域中存活的對象一起轉(zhuǎn)移到幸存者1區(qū)域中

    2024年02月15日
    瀏覽(22)
  • JVM | Java內(nèi)存區(qū)域

    JVM | Java內(nèi)存區(qū)域

    以上筆記基于JavaGuide整理 JDK 1.8: 線程私有 的:程序計數(shù)器,虛擬機(jī)棧,本地方法棧 線程共享 的:堆,方法區(qū)(元空間),直接內(nèi)存 (非運行時數(shù)據(jù)區(qū)的一部分) 程序計數(shù)器有兩個作用: 字節(jié)碼解釋器通過改變程序計數(shù)器來依次讀取指令,從而 實現(xiàn)代碼的流程控制 ,如:順

    2024年02月08日
    瀏覽(26)
  • JVM——Java 內(nèi)存區(qū)域詳解

    JVM——Java 內(nèi)存區(qū)域詳解

    如果沒有特殊說明,都是針對的是 HotSpot 虛擬機(jī)。 基本問題 介紹下 Java 內(nèi)存區(qū)域(運行時數(shù)據(jù)區(qū)) Java 對象的創(chuàng)建過程(五步,建議能默寫出來并且要知道每一步虛擬機(jī)做了什么) 對象的訪問定位的兩種方式(句柄和直接指針兩種方式) 拓展問題 String 類和常量池 8 種基本

    2024年02月13日
    瀏覽(20)
  • 【Java虛擬機(jī)學(xué)習(xí)1】JVM運行時數(shù)據(jù)區(qū)

    【Java虛擬機(jī)學(xué)習(xí)1】JVM運行時數(shù)據(jù)區(qū)

    我們知道Java程序是運行在JVM(Java虛擬機(jī))上的,Java程序運行時會占用一定的內(nèi)存,在虛擬機(jī)自動管理機(jī)制的幫助下,不再需要為每一個new操作去寫配對的delete/free代碼,不容易出現(xiàn)內(nèi)存泄漏和內(nèi)存溢出的問題,看起來由虛擬機(jī)管理內(nèi)存一切都很美好。不過,也正式因為Java程

    2024年02月16日
    瀏覽(21)
  • JVM篇--Java內(nèi)存區(qū)域高頻面試題

    JVM篇--Java內(nèi)存區(qū)域高頻面試題

    首先我們要知道java堆空間的產(chǎn)生過程: 即當(dāng)通過java命令啟動java進(jìn)程的時候,就會為它分配內(nèi)存,而分配內(nèi)存的一部分就會用于創(chuàng)建堆空間,而當(dāng)程序中創(chuàng)建對象的時候 就會從堆空間來分配內(nèi)存,所以堆空間存放的主要是對象和數(shù)組; 而GC 其實說白了就是java虛擬機(jī)回收對象

    2024年02月01日
    瀏覽(57)
  • 深入理解 JVM 之——Java 內(nèi)存區(qū)域與溢出異常

    深入理解 JVM 之——Java 內(nèi)存區(qū)域與溢出異常

    更好的閱讀體驗 huge{color{red}{更好的閱讀體驗}} 更好的閱讀體驗 本篇為深入理解 Java 虛擬機(jī)第二章內(nèi)容,推薦在學(xué)習(xí)前先掌握基礎(chǔ)的 Linux 操作、編譯原理、計算機(jī)組成原理等計算機(jī)基礎(chǔ)以及扎實的 C/C++ 功底。 該系列的 GitHub 倉庫:https://github.com/Doge2077/learn-jvm Java 虛擬機(jī)在

    2024年02月09日
    瀏覽(22)
  • JVM工作原理與實戰(zhàn)(十六):運行時數(shù)據(jù)區(qū)-Java虛擬機(jī)棧

    JVM工作原理與實戰(zhàn)(十六):運行時數(shù)據(jù)區(qū)-Java虛擬機(jī)棧

    JVM工作原理與實戰(zhàn) RabbitMQ入門指南 從零開始了解大數(shù)據(jù) 目錄 專欄導(dǎo)航 前言 一、運行時數(shù)據(jù)區(qū) 二、Java虛擬機(jī)棧 1.棧幀的組成 2.局部變量表 3.操作數(shù)棧 4.幀數(shù)據(jù) 總結(jié) JVM作為Java程序的運行環(huán)境,其負(fù)責(zé)解釋和執(zhí)行字節(jié)碼,管理內(nèi)存,確保安全,支持多線程和提供性能監(jiān)控工具

    2024年01月20日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包