美文网首页
JVM 内存模型

JVM 内存模型

作者: 滨岩 | 来源:发表于2020-03-02 00:24 被阅读0次

JVM 内存模型JMM(Java Memory Model)

Java 代码:

public class MainTest {


    private int compute() {
        int a = 1;
        int b = 2;
        int c = a * b + 10;

        return c;
    }

    public static void main(String[] args) {

        MainTest mainTest = new MainTest();
        int ret = mainTest.compute();

        System.out.println(ret);
    }
}

idea可以安装jclasslib插件,来查看字节码:


image.png

JVM 运行时数据区内存模型:

JVM内存模型.jpg

“绿色区域”:栈、本地方法栈、程序计数器为线程运行时独有的数据区域
“黄色区域”:堆、方法区为所有内存之间共享的内存区域。

线程独有的内存区域

1、程序计数器(Program counter register)

程序计数器内存区域很小,它是当前线程所执行的字节码的行号指示器(LineNumber),字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令。
只有Java的方法这个计数器才有值,如果执行的是一个Native方法,那这个计数器是空的。

JVM的多线程实现:JVM的多线程是通过CPU时间片轮转(即线程轮流切换并分配处理器执行时间)算法来实现的。当一个正在执行的线程因为时间片耗尽被挂起,另一个线程获取到时间片开始执行。
当被挂起的线程重新获取到时间片的时候,它要想从被挂起的地方继续执行,就必须知道它上次执行到哪个位置了,这时候LineNumer就起作用了,在JVM中,通过程序计数器记录某个线程的字节码执行位置

程序计数器是具备线程隔离的特性,每个线程工作时都有属于自己的独立计数器。

Java 虚拟机栈(Java Virtual Machine Stacks)

Java 虚拟机栈是线程私有的,生命周期随着线程启动而产生,线程结束而消亡。
Java虚拟机描述的是Java 方法执行的内存模型,用于存储栈帧。线程启动时会创建虚拟机栈,每个方法在执行时会在虚拟机栈中创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法返回地址、附加信息等。
每个方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中的入栈到出栈的过程。
内存不需要保证连续的,可以通过-Xss 设置成固定大小,也可以动态扩容和缩容。

局部变量表的容量以变量(Variable Slot)为最小单位,存放8种类型 byte、short、int、float、char、boolean、reference; 注意一下,局部变量表的引用存储的都是局部变量的对象引用,而不是成员变量(getter setter属性)的对象引用。成员变量的对象引用是存储在JAVA 堆(Heap)中),虚拟机栈工作流程如下图所示:


虚拟机栈.jpg

本地方法栈

本地方法栈(Native Method Stacks)与Java 虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机为虚拟机执行Java方法(字节码)服务,本地方法栈为Native方法服务
Native 方法则是虚拟机通过JNI直接调用本地C/C++库


Java本地方法栈.png

线程共享区域

Java 堆是垃圾收集器管理的主要区域,堆内存分为新生代(Young)和老年代(Old),新生代(Yong)分为Eden、From Survivor、To Survivor,如下图所示:

image.png

假如一个电商网站,每日点击上亿次,每个用户平均点击二三十次,那么日活用户=1亿/20=500万,假如付费转化率10%,500万10%=50万订单,正常情况下50订单是在三四小时产生的,平均下来也就几十单,压力是能抗住的。但是在大促的时候,50万订单都是在前几分钟产生,假设每秒1000多单,有三台订单服务器,分配到每台机器大概是300单/每秒,每个订单对象1KB,所以又每秒300KB订单对象生成,下单还涉及到其他对象,比如库存、优惠券、积分等,放大20倍,300KB20/秒对象生成,可能同时还有其他操作,如订单查询等,再放大10倍,那就是300KB2010/秒,每秒产生60MB对象,1秒后都变成垃圾对象。

java -Xms3072M -Xms3072M -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -jar order.jar

image.png

当分配的内存的时候 eden区内存已经被分配完了,当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC,GC期间虚拟机又发现回收对象无法存入Survior空间,所以只好把新生代的对象提前转移到老年代,老年代上的空间足够存放回收对象时,就不会出现Full GC ,执行Minor GC 后,后面分配的对象如果能够存在Eden区的话,还会在Eden区分配内存

可以用如下代码验证

public class GCMainTest{
 
    public static void main(String[] args) throws InterruptedException{
         byte[] allocation1,allocation2,allocation3,
         allocation4,allocation5,allocation6;
         
         allocation1=new byte[60000*1024];
         allocation2=new byte[8000*1024];
         
         allocation3=new byte[1000*1024];
         allocation4=new byte[1000*1024];
         allocation5=new byte[1000*1024];
         allocation6=new byte[1000*1024];
    }
}

java -Xms3072M -Xms3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -jar order.jar

加上 -Xmn2048M

image.png

相关文章

  • JVM内存模型(jvm 入门篇)

    概述 jvm 入门篇,想要学习jvm,必须先得了解JVM内存模型,JVM内存模型,JVM内存模型,JVM内存模型,...

  • JVM

    栈容量由-Xss指定深入理解JVM—JVM内存模型 JVM内存模型和JVM参数的关系

  • [Java多线程编程之八] Java内存模型

    一、Java内存模型 == JVM内存模型?   很多人都会认为Java内存模型就是JVM内存模型,但实际上是错的...

  • JVM问题及解答

    常见JVM问题 JVM内存模型,GC机制和原理。注意JVM内存模型与Java内存模型(JMM)不是同一个东西。JV...

  • JVM内存结构和Java内存模型

    最近看到两个比较容易混淆的概念:JVM内存结构和Java内存模型 JVM内存结构JVM内存结构或者说内存模型指的是...

  • 高效并发

    从JVM的角度看一下Java与线程,内存模型,线程安全以及JVM对于锁的优化 硬件内存模型与JVM内存模型 硬件的...

  • jvm

    1.5.1JVM的内存模型 首先我们来了解一下JVM的内存模型的怎么样的: 基于jdk1.8画的JVM的内存模型-...

  • JVM基础知识点

    1. 内存模型以及分区,需要详细到每个区放什么(共分为5个)。 JVM内存模型及分区jvm内存模型和内存分配 程序...

  • 面试系列之JVM

    1.jvm内存模型 jvm内存模型主要有运行时期模型和非运行时期两部分组成,通常说的jvm内存模型是指运行时期内存...

  • jvm内存模型

    Java虚拟机内存模型 计划发布3篇博客, 这是第一篇:jvm内存模型 jvm内存模型 对象创建和内存分配 OOM...

网友评论

      本文标题:JVM 内存模型

      本文链接:https://www.haomeiwen.com/subject/rfwdkhtx.html