详解Jvm内存结构

详解Jvm内存结构近期在学习研究内存,那么Jvm内存结构和Jvm的内存模型即JMM(Javamomerymodel)这两项内容都是学习java虚拟机、java内存知识的基础。为了让自己加深理解,有不至于嵌入到底层细节太深,会通过一段代码片段类比到内存结构图中的真实呈现。一、Jvm体系的内存结构图JVM运行数据区,也就是我们所说的内存结构主要分为两个大区:1、线程共享区**方法区(MethodArea)????*存储运行时的常量池、被虚拟机加载过的类信息、常量、静态变量、即时编译器编译后的代码数据。**堆区(

大家好,又见面了,我是你们的朋友全栈君。

近期在学习研究内存,那么Jvm内存结构和Jvm的内存模型即JMM(Java momery model)这两项内容都是学习java虚拟机、java内存知识的基础。为了让自己加深理解,有不至于嵌入到底层细节太深,会通过一段代码片段类比到内存结构图中的真实呈现。

一、Jvm体系的内存结构图

详解Jvm内存结构

JVM运行数据区,也就是我们所说的内存结构主要分为两个大区:

1、线程共享区

**方法区(Method Area)?*存储运行时的常量池、被虚拟机加载过的类信息、常量、静态变量、即时编译器编译后的代码数据。

**堆区(Heap Area)?*所有的对象实例以及数组都要在堆上分配,也是垃圾回收器主要管理的对象。

2、线程独占区

**虚拟机栈:**又称Java栈,存储局部变量表、操作栈、动态链接、方法出口,对象指针。

**本地方法栈:**为虚拟机使用到的Native 方法服务。如Java使用c或者c++编写的接口服务时,代码在此区运行,Android中的Jni本地方法调用亦该如此。

**程序计数器:**当前线程执行的字节码的行号指示器。

接下来我们通过一段简单的代码来看实际内存结构图

二、内存结构图实例分析

先看实例代码:

public class MemoryStructure { 
   
    static  int sSize =10;//静态变量 方法区
    static MemoryObj memoryObj=new MemoryObj(sSize);//声明部分(静态类变量)放在方法区,对象实例在堆中
    int initSize=20;//类的成员变量 堆区
    MemoryObj memoryObj2=new MemoryObj(initSize);//声明部分(引用类型成员变量),实例都在 堆中
    public static void main(String[] args) { 
   
        //MemoryStructure memoryStructure 声明部分(引用类型) 放在虚拟栈
        MemoryStructure memoryStructure = new MemoryStructure();
        int size3=30;//栈区
        //MemoryObj memoryObj3声明部分(引用类型) 放在虚拟栈
        MemoryObj memoryObj3= new MemoryObj(size3);

        //新开线程 :新的独享虚拟栈
        new Thread(){ 
   
            @Override
            public void run() { 
   
                int k=40;//栈区
                setSize(40);
            }

            void setSize(int size){ 
   
                memoryStructure.memoryObj2.size=size;
                //说明:
                //新线程访问主线程的局部变量是无法访问的,当前编译器没有报错,是因为idea工具编译做了处理
                //查看一下编译后的字节码: final MemoryObj memoryObj3 = new MemoryObj(size3); 
                MemoryObj temp=memoryObj3;
            }
        }.start();
    }
}

class MemoryObj{ 
   
    int size;
    public MemoryObj(int size) { 
   
        this.size = size;
    }
}

上述代码,对照内存结构图的分布位置如下:

详解Jvm内存结构

正如代码中的注释和上述代码片段在各区中的分布图,能很清晰的知晓Jvm的内存结构。

补充一些堆和方法区的理解,虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java 堆区分开来。

方法区是为类信息服务的,存储类信息、常量、静态变量。成员变量直接存在在堆中。

虚拟栈区可以理解成为程序的执行服务的,方法中定义的局部变量,被保存在这个位置,最终方法的执行是通过出栈压栈的方式执行。

方法区、堆区是共享区域;虚拟栈区是独享区域

每一个线程都会对应一个虚拟栈(又称java栈),上述newThread中的MemoryObj temp=memoryObj3;,若memoryObj3是无final修饰,是无法直接访问的,栈内数据是独享的。

这篇是通过一个实例分析的方式,对jvm的内存结构有了更清晰的认识。如若想做更深度的了解,推荐《深入理解 Java 虚拟机》这本书籍。
获得更多更新,关注gongzhonghao:Hym4Android
详解Jvm内存结构

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140576.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • yum linux centos安装mysql详细教程[通俗易懂]

    yum linux centos安装mysql详细教程[通俗易懂]1、前往如下地址下载https://dev.mysql.com/downloads/repo/yum/(访问较慢,文末也会附上下载地址)我的系统是centos7,选择linux7即可2、点击download,进入下载页面这里点鼠标右键–复制链接地址即可(https://dev.mysql.com/get/mysql80-community-release-el7-3.noar…

    2022年6月26日
    35
  • CSS-精灵图片的使用(从一张图片中截图指定位置图标)

    CSS-精灵图片的使用(从一张图片中截图指定位置图标)目录一、名词解释二、使用难点三、使用步骤四、程序源码一、名词解释  在网页中,我们可以看到有很多的小图标,比如微博上的登录位置有很多这样的小图标。因为浏览器显示网页的所有内容都需要从我们自己的服务器进行下载,如果将这些图标分别存在服务器上,那么当需要显示的时候将会发出很多次请求–>响应–>下载,这样一来将会消耗大量的时间来下载这些小图标  所…

    2022年5月5日
    43
  • leapFTP上传网页到服务器,leapftp登录ftp服务器

    leapFTP上传网页到服务器,leapftp登录ftp服务器leapftp登录ftp服务器内容精选换一换本节为您介绍如何在本机使用远程登录工具MSTSC登录Windows弹性云服务器。弹性云服务器状态为“运行中”。如果弹性云服务器采用密钥方式鉴权,已获取Windows弹性云服务器的密码,获取方式请参见获取Windows弹性云服务器的密码。弹性云服务器已经绑定弹性公网IP,绑定方式请参见绑定弹性公网IP。使用MSTSC方式通过内网登录云服务器华为云帮助中心…

    2025年8月6日
    3
  • Ubuntu 及衍生版本用户如何安装 SmartGit/HG

    Ubuntu 及衍生版本用户如何安装 SmartGit/HG

    2021年9月11日
    48
  • chmod命令用法举例「建议收藏」

    chmod命令用法举例「建议收藏」chmod命令用于改变linux系统文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。利用chown命令来更改某个文件或目录的所有者。利用chgrp命令来更改某个文件或目录的用户组。 chmod命令详细情况如下:1.命令格式:chmod[-cfvR][–help][–version]modefile  …

    2022年6月28日
    41
  • 学习资料下载地址[通俗易懂]

    学习资料下载地址

    2022年1月20日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号