java--jvm内存模型

1。栈(本地虚拟机栈):    里边对应一层层的栈帧, 每个栈帧用来存储一个方法的局部变量表和操作数栈, 方法返回地址等信息。

2.堆: 存储new出来的对象, new出来的数组。  对象中还会维护一个指向对象所属类的指针,方便知道当前这个对象是由哪个类创建的

3.方法区: 

         JDK1.6及1.6之前  sun的hostspot虚拟机用的是永久代方式实现的,

              里边存了:  静态变量、字符串常量池、方法信息(方法的名称、返回值、参数数量及类型、方法的字节码信息、局部变量表信息,操作数栈信息)、从class字节码文件加载的类的相关信息<类的全限定名,类的直接父类名称,修饰符,直接接口的一个有序列表.

需要注意的是使用final修饰的静态变量称为全局常量,在编译的时候就会被分配了。

              在逻辑上是属于堆的一部分。其物理内存也都

              是可以是不连续的,大小可以指定或者动态扩展。

       JDK 1.7时,方法区也被称为永久代,但是开始准备逐渐去除掉永久代了,

             此时静态变量、字符串常量池移动到了堆空间中(因为他们使用很频繁,放在方法区中基本不会回收容易导致oom,放在堆中在full GC时会被回收)

            (方法区中存储了方法信息、从class字节码文件加载的类的相关信息<类的全限定名,类的直接父类名称,修饰符,直接接口的一个有序列表,>)

       JDK1.8及1.8之后 方法区采用了元空间方式实现(采用了计算机直接内存)(其他的没变),

             此时静态变量、字符串常量池移还被保留在了堆空间中

            (方法区中存储了方法信息、从class字节码文件加载的类的相关信息)

       方法区的垃圾回收主要回收常量池中废弃的常量和不再使用的类型。

方法区的垃圾回收主要回收常量池中废弃的常量和不再使用的类型。      

常量池中的常量主要存放两大类常量,一类是字面量,一类是符号引用,只要常量池中的常量没有被任何地方引用就会被回收,这与堆空间的对象回收相似。而回收不再使用的类型比较苛刻,必须保证这个类所有的对象实例都已经被回收,并且加载这个类的类加载器也已经被回收,还有就是这个类对应的Class对象没有在任何被引用,满足这三个条件这个类才允许被回收,注意,是允许,并不代表一定会回收,由此可见方法区想要进行垃圾回收十分困难。
 

推荐博文:  8张图 让你明白 Java内存区域 - 知乎 (zhihu.com)

https://zhuanlan.zhihu.com/p/297001119

Java内存区域详解(万字总结!一篇入魂!点赞收藏!)_煎丶包的博客-CSDN博客推荐博文:  Java内存区域详解(万字总结!一篇入魂!点赞收藏!)_煎丶包的博客-CSDN博客

https://blog.csdn.net/qq_39794062/article/details/120100443

13 张图解 Java 中的内存模型 - 知乎 (zhihu.com)

https://zhuanlan.zhihu.com/p/208249150

图片:关于常量池的解释

Java内存模型(JMM)总结 - 知乎 (zhihu.com) 

https://zhuanlan.zhihu.com/p/29881777

Java内存模型Java Memory Model,JMM)定义了Java程序在多线程环境下的内存访问规则。它规定了线程如何和主内存、本地内存以及其他线程进行通信。 JVM内存模型是指Java虚拟机(Java Virtual Machine,JVM)在执行Java程序时的内存布局和管理方式。JVM内存模型包括了堆内存、栈内存、方法区、直接内存等。 在Java内存模型中,主要有以下几个概念: 1. 主内存:所有线程共享的内存区域,包含了实例字段、静态字段以及数组元素。 2. 工作内存:每个线程独立的内存区域,包含了该线程使用的变量副本或者缓存。 3. 内存间的交互操作:线程之间通过读写主内存来进行通信。 4. 原子性、可见性和有序性:JMM保证了原子性(对基本类型的读写操作具有原子性)、可见性(一个线程对主内存的修改对其他线程是可见的)和有序性(在一个线程中,按照程序顺序执行)。 JVM内存模型主要包括以下几个部分: 1. 堆内存:用于存储对象实例,由垃圾回收器进行管理。 2. 栈内存:用于存储方法的局部变量和方法调用的信息。每个线程都有自己的栈内存。 3. 方法区:用于存储类的信息、常量、静态变量等。 4. 直接内存:在堆外分配内存,不受JVM管理,由操作系统进行管理。 需要注意的是,JVM内存模型是具体实现的一种规范,可以根据不同的JVM厂商进行优化和调整。而Java内存模型Java语言规范中定义的多线程内存访问规则,对于不同的JVM实现都是一样的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值