java:JVM内存结构初步理解入门:堆、栈、方法区(浅显通俗易懂自记)

自己整理的一些资料以及自己的一些理解,希望记下来的不是高大上而晦涩的概念,将自己此时此刻的理解最大程度地刻模,以便将来重温知新。

JVM内存结构最简单可以初步分为:1栈 2堆 3方法区 4 程序计数器

一、栈区

        方法每次被线程调用都会在栈区开辟新的内存空间——栈帧,每个线程包含一个栈帧,每个栈帧中的数据(基本数据类型和对象引用)都是私有的,其他栈帧不能访问,也就是说,同一个方法的不同线程执行彼此是互不干扰的。

        栈分为三个部分:基本类型变量区、执行环境上下文(字面意思)、操作指令区(存放操作指令)

二、堆区

        栈存储的是基本数据类型和对象引用,而堆存储的全部是对象。

        每个对象都包含一个与之对应的class的信息(class的目的是查看方法区是否有对应的字节码文字对象,有就创建对象)

        每个线程包含一个栈帧,堆区不同,JVM里只有一个完整的堆区被所有线程共享。

三、方法区

        又称为静态区,与堆一样,被所有线程共享。

        方法区包含的都是在整个程序中永远唯一的元素,如:class文件(包含类的字段、方法、接口、常量池(用来存储编译期间生成的常量信息,如字面量和符号引用)等)和static变量

四、程序计数器

        在通用的计算机体系中,程序计数器用来记录当前正在执行的指令,在JVM中也是如此,它是一块比较小的内存空间。

        一个线程的执行,是通过字节码解释器改变当前线程的计数器的值,来获取下一条需要执行的字节码指令,从而确保线程的正确执行。

        为了确保线程切换后(上下文切换)能恢复到正确的执行位置,每个线程都有一个独立的程序计数器,各个线程的计数器互不影响,独立存储。也就是说程序计数器是线程私有的内存。

        程序计数器是随他的线程共存亡的,线程开始,程序计数器创建,线程结束,程序计数器消亡。

        由于Java支持多线程,Java中的程序计数器用来记录当前线程中正在执行的指令。如果当前正在执行的方法是本地方法,那么此刻程序计数器的值为undefined。

        注意!这个区域是唯一一个不抛出OutOfMemoryError的运行时数据区。

        总结:初步认识JAVA内存结构对于初步的入门学习足够了,知道栈里存储对象引用与基本数据类型,堆里存储对象,方法区里存储静态变量和方法还有class文件里的字段与接口,主要是方法!

- - - - - -  - - -- - - - - - - - -  - - - - - - - - - -  - - - -- - - - -  - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - -  - - - - -

        再可以知道比如:

        java六大存储区域:

        1 寄存器 最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。知道就好,因为寄存器数量有限,所以寄存器由编译器按需分配,我们不能直接控制,我们在程序中碰不到他。

        2 栈 见上述

        3 堆 见上述

        4 静态存储区,其实就是方法区,见上述

        5 常量存储  常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中。

       (声明为final static的为常量,可以保存在常量储存区,还有String类型的对象都是常量,系统维护了一个String常量池。 String类型是final修饰的,无法被继承)

        6 非RAM存储 数据完全存活于程序之外,不受程序控制,程序不运行他也可以存在。

        另外:

        上述中说的栈、堆、都放在RAM(主存)中,常量存储有时候可以放在ROM(只读内存)中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值