详解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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Springboot+vue项目旅游管理系统

    Springboot+vue项目旅游管理系统摘要计算机的普及和互联网时代的到来使信息的发布和传播更加方便快捷。用户可以通过计算机上的浏览器访问多个应用系统,从中获取一些可以满足用户需求的管理系统。网站系统有时更像是一个大型“展示平台”,用户可以选择所需的信息进入系统查看首页、景点信息、酒店信息、客房信息、旅游路线,当地特色等、个人中心、后台管理等。系统所要实现的功能分析,对于现在网络方便的管理,据数据调查显示,相比过去增长较快,用户通过网上登录的方式已经形成了一种依赖,不管需要什么信息内容,直接上网查找,参考比较大,对旅游管理系统的类型和特

    2022年6月5日
    32
  • ajax怎么解决报414,如何解决HTTP 414“请求URI太长”错误?

    ajax怎么解决报414,如何解决HTTP 414“请求URI太长”错误?根据约翰的回答,我将GET请求更改为POST请求。它可以工作,而无需更改服务器配置。所以我去寻找如何实现这一点。以下页面是有帮助的:带有PHP的jQueryAjaxPOST示例(注意清理发布的数据注释)和http://www.openjs.com/articles/ajax_xmlhttp_using_post.php基本上,区别在于GET请求在一个字符串中包含url和参数,然后发送null…

    2022年5月31日
    40
  • MFC的图片按钮

    MFC的图片按钮

    2021年8月31日
    49
  • python安装pycryptodome_python代码如何转成c代码

    python安装pycryptodome_python代码如何转成c代码在windows下用一下开源工具就是悲催,如题python安装pycrypto在windows也是很麻烦。一般在官方网站下载:https://www.dlitz.net/software/pycrypto/然后使用命令就可以安装成功了:pythonsetup.pybuildpythonsetup.pyinstall但是在windows下会报错:Pythonerror:Unableto…

    2025年7月15日
    3
  • java虚拟机内存大小_jvm内存分布

    java虚拟机内存大小_jvm内存分布目录一、虚拟机二、虚拟机组成1.栈栈帧2.程序计数器3.方法区对象组成4.本地方法栈5.堆GCGC案例一、虚拟机​同样的java代码在不同平台生成的机器码肯定是不一样的,因为不同的操作系统底层的硬件指令集是不同的。同一个java代码在windows上生成的机器码可能是0101…….,在linux上生成的可能是1100…….

    2022年10月20日
    3
  • .NET NPOI导出Excel详解[通俗易懂]

    .NET NPOI导出Excel详解[通俗易懂]NPOI,顾名思义,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office的文件。支持的文件格式包括xls,doc,ppt等。官方网站:http://npoi.codeplex.com/nuget直接获取使用一、NPOI生成Excel//创建…

    2022年6月16日
    154

发表回复

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

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