亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解JVM系列之內(nèi)存模型

 更新時(shí)間:2021年06月10日 10:50:33   作者:smileNicky  
JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的機(jī)器,是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種功能實(shí)現(xiàn)的。JVM的內(nèi)存區(qū)域可以被分為:線程、棧、堆、靜態(tài)方法區(qū)。本文將介紹JVM的內(nèi)存模型,感興趣的小伙伴,可以參考下

1. 內(nèi)存模型和運(yùn)行時(shí)數(shù)據(jù)區(qū)

這一章學(xué)習(xí)java虛擬機(jī)內(nèi)存模型(Java Virtual machine menory model),可以這樣理解,jvm運(yùn)行時(shí)數(shù)據(jù)庫(kù)是一種規(guī)范,而JVM內(nèi)存模型是對(duì)改規(guī)范的實(shí)現(xiàn)

java虛擬機(jī)重點(diǎn)存儲(chǔ)數(shù)據(jù)的是堆和方法區(qū),所以本章節(jié)也重點(diǎn)從這兩個(gè)方面進(jìn)行比較詳細(xì)描述。堆和方法區(qū)是內(nèi)存共享的,而java虛擬機(jī)棧、Native方法棧、程序計(jì)數(shù)器是線程私有的

2、思維導(dǎo)圖和圖例

一個(gè)是非堆區(qū)(方法區(qū)),方法區(qū)也一般被稱(chēng)之為“永久代”。另外一個(gè)是堆區(qū),分為young區(qū)和old區(qū),young區(qū)又分為兩個(gè)部分,一個(gè)是Eden區(qū),一個(gè)是Survivor區(qū)(S0+S1),S0區(qū)也可以稱(chēng)之From區(qū),S1也可以稱(chēng)之為T(mén)o區(qū)

3、對(duì)象向JVM申請(qǐng)空間

4、為什么需要Survivor區(qū)?

為什么需要Survivor區(qū)?只有Eden不行嗎?

假設(shè)不設(shè)計(jì)出Survivor區(qū),Eden區(qū)進(jìn)行一次MinorGC,對(duì)象就直接被送到Old區(qū),這樣一來(lái)Old區(qū)很快就被填滿(mǎn),Old區(qū)一滿(mǎn),就會(huì)進(jìn)行FullGC(Old區(qū)會(huì)進(jìn)行MajorGC,一般伴隨著MinorGC),F(xiàn)ullGC是很耗時(shí)的,所以設(shè)計(jì)出Survivor區(qū)的目的是減少對(duì)象被送到Old區(qū),有一個(gè)過(guò)渡的Survivor區(qū)

補(bǔ)充:Minor GC:新生代
Major GC:老年代
Full GC:新生代+老年代
Eden:S1:S2是8:1:1

5、為什么需要兩個(gè)Survivor區(qū)?

需要兩個(gè)Survivor區(qū)的目的是為了避免內(nèi)存碎片化。為什么這么說(shuō)?
假設(shè)只設(shè)計(jì)出一個(gè)Survivor區(qū),一旦Eden區(qū)滿(mǎn)了,就會(huì)進(jìn)行Minor GC,Eden區(qū)存活的對(duì)象就會(huì)被移動(dòng)到Survivor區(qū),等下一次Eden區(qū)滿(mǎn)時(shí)候,問(wèn)題就來(lái)了,進(jìn)行MinorGC就將Eden區(qū)對(duì)象硬放到Survivor區(qū),這樣就導(dǎo)致了對(duì)象所占的內(nèi)存是不連續(xù)的

6、例子進(jìn)行驗(yàn)證

堆內(nèi)存溢出

import lombok.Data;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class HeapController {

    List<Foo> list = new ArrayList<Foo>();
    @GetMapping(value = {"heap"})
    public String heapTest() {
        while (true) {
            list.add(new Foo());
        }
    }


    @Data
    class Foo {
        String str;
    }
}

訪問(wèn)接口,出現(xiàn)內(nèi)存溢出;

java.lang.OutOfMemoryError: Java heap space

...

可以設(shè)置參數(shù):比如-Xms64M -Xmx512M

方法區(qū)內(nèi)存溢出

使用asm,maven配置:

<dependency>
  <groupId>asm</groupId>
  <artifactId>asm</artifactId>
  <version>3.3.1</version>
</dependency>

編寫(xiě)代碼,向方法區(qū)中添加Class的信息,注意,電腦性能不夠好,不要執(zhí)行此代碼,很容易,造成電腦重啟,太吃?xún)?nèi)存,也可以調(diào)小循環(huán)次數(shù)

import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

import java.util.ArrayList;
import java.util.List;

public class MyMetaspace extends ClassLoader {

  public static List<Class<?>> createClasses() {
    List<Class<?>> classes = new ArrayList<Class<?>>();
    for (int i = 0; i < 10000000; ++i) {
      ClassWriter cw = new ClassWriter(0);
      cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "Class" + i, null,
              "java/lang/Object", null);
      MethodVisitor mw = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>",
              "()V", null, null);
      mw.visitVarInsn(Opcodes.ALOAD, 0);
      mw.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object",
              "<init>", "()V");
      mw.visitInsn(Opcodes.RETURN);
      mw.visitMaxs(1, 1);
      mw.visitEnd();
      MyMetaspace test = new MyMetaspace();
      byte[] code = cw.toByteArray();
      Class<?> exampleClass = test.defineClass("Class" + i, code, 0,
              code.length);
      classes.add(exampleClass);
    }
    return classes;
  }
}

方法區(qū)測(cè)試接口:

import com.example.jvm.jvmexceptionexample.asm.MyMetaspace;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class NonHeapController {

    List<Class<?>> list = new ArrayList<Class<?>>();

    @GetMapping(value = {"/noheap"})
    public String noheap() {
        while (true) {
            list.addAll(MyMetaspace.createClasses());
        }
    }

}

java.lang.OutOfMemoryError: Metaspace

at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.5_54]

處理方法,設(shè)置Metaspace的大小,比如-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=512M

Java虛擬機(jī)棧

在前面學(xué)習(xí),java虛擬機(jī)棧是通過(guò)棧幀方式存儲(chǔ),一個(gè)方法對(duì)應(yīng)一個(gè)棧幀,按照隊(duì)列模式進(jìn)棧,所以要測(cè)試程序?qū)е耲ava虛擬機(jī)棧出現(xiàn)問(wèn)題,可以通過(guò)遞歸方法方式進(jìn)行測(cè)試:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class StackController {

    public static long count = 0;

    public static void add(long i) {
        count ++ ;
        add(i);
    }

    @GetMapping(value = {"stack"})
    public void stack() {
        add(1);
    }

}

StackOverflow,棧溢出異常:

java.lang.StackOverflowError: null

at com.example.jvm.jvmexceptionexample.controller.StackController.add(StackController.java:14) ~[classes/:na]

處理方法,設(shè)置-Xss256k:設(shè)置每個(gè)線程的堆棧大小。JDK 5以后每個(gè)線程堆棧大小為1M,以前每個(gè)線程堆棧大小為256K

以上就是詳解JVM系列之內(nèi)存模型的詳細(xì)內(nèi)容,更多關(guān)于JVM 內(nèi)存模型 內(nèi)存結(jié)構(gòu)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 整理一下常見(jiàn)的IE錯(cuò)誤

    整理一下常見(jiàn)的IE錯(cuò)誤

    多年以來(lái),IE一直都是最難于調(diào)試JavaScript 錯(cuò)誤的瀏覽器。IE給出的錯(cuò)誤消息一般很短又語(yǔ)焉不詳。而且上下文信息也很少,有時(shí)甚至一點(diǎn)都沒(méi)有。下面幾小節(jié)將分別探討一些在IE中難于調(diào)試的JavaScript 錯(cuò)誤
    2016-11-11
  • JS提示:Uncaught SyntaxError:Unexpected token ) 錯(cuò)誤的解決方法

    JS提示:Uncaught SyntaxError:Unexpected token ) 錯(cuò)誤的解決方法

    這篇文章主要介紹了JS提示:Uncaught SyntaxError:Unexpected token ) 錯(cuò)誤的解決方法,結(jié)合實(shí)例形式分析了javascript提示此類(lèi)異常的常見(jiàn)原因與相關(guān)解決方法,需要的朋友可以參考下
    2016-08-08
  • 微信小程序?qū)崿F(xiàn)文字跑馬燈

    微信小程序?qū)崿F(xiàn)文字跑馬燈

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)文字跑馬燈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • JavaScript實(shí)現(xiàn)短暫提示框功能

    JavaScript實(shí)現(xiàn)短暫提示框功能

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)短暫提示框功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-04-04
  • Javascript中的delete介紹

    Javascript中的delete介紹

    關(guān)于JavaScript中的Delete一直沒(méi)有弄的很清楚,最近看到兩篇這方面的文章,現(xiàn)對(duì)兩文中部分內(nèi)容進(jìn)行翻譯(內(nèi)容有修改和添加,順序不完全一致,有興趣推薦看原文),希望能對(duì)大家有所幫助
    2012-09-09
  • 隨機(jī)生成10個(gè)不重復(fù)的0-100的數(shù)字(實(shí)例講解)

    隨機(jī)生成10個(gè)不重復(fù)的0-100的數(shù)字(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇隨機(jī)生成10個(gè)不重復(fù)的0-100的數(shù)字(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • JavaScript編碼風(fēng)格精選指南(編寫(xiě)可維護(hù)的代碼規(guī)范)

    JavaScript編碼風(fēng)格精選指南(編寫(xiě)可維護(hù)的代碼規(guī)范)

    javascript編碼規(guī)范能夠增強(qiáng)代碼的簡(jiǎn)潔性、可讀性、可擴(kuò)展性,項(xiàng)目做到后期,每修改一次,所耗費(fèi)的成本就越高,編碼規(guī)范能節(jié)省這樣的成本,并且能很好拓展升級(jí)原有系統(tǒng)功能,javascript編碼規(guī)范也是開(kāi)源社區(qū)大家約定俗成的規(guī)則!
    2024-06-06
  • JS簡(jiǎn)單判斷滾動(dòng)條的滾動(dòng)方向?qū)崿F(xiàn)方法

    JS簡(jiǎn)單判斷滾動(dòng)條的滾動(dòng)方向?qū)崿F(xiàn)方法

    這篇文章主要介紹了JS簡(jiǎn)單判斷滾動(dòng)條的滾動(dòng)方向?qū)崿F(xiàn)方法,涉及javascript針對(duì)scrollTop事件的相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04
  • JavaScript數(shù)據(jù)類(lèi)型轉(zhuǎn)換詳解(推薦)

    JavaScript數(shù)據(jù)類(lèi)型轉(zhuǎn)換詳解(推薦)

    眾所周知JavaScript是一門(mén)弱類(lèi)型(語(yǔ)言,即變量的類(lèi)型是不確定的。所以下面這篇文章主要給大家介紹了關(guān)于JavaScript數(shù)據(jù)類(lèi)型轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • javascript實(shí)現(xiàn)修改微信分享的標(biāo)題內(nèi)容等

    javascript實(shí)現(xiàn)修改微信分享的標(biāo)題內(nèi)容等

    這篇文章主要介紹了javascript實(shí)現(xiàn)修改微信分享的標(biāo)題內(nèi)容等,需要的朋友可以參考下
    2014-12-12

最新評(píng)論