JVM内存模型

根据JVM内存模型,Java程序运行时有五个逻辑分区:

方法区

虚拟机栈

本地方法栈

程序计数器

其中方法区和堆是被所有线程所共享

虚拟机栈,本地方法栈,程序计数器则是为各个线程所私有。

一、方法区

  • 方法区存放不会轻易改变的内容

  • .Class文件 被JVM装载 => 变为方法区中一段特定的数据结构

  • 运行时常量池(Runtime Constant Pool)

    Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到常量池中。

    运行时常量是相对于常量来说的,它具备一个重要特征是:动态性。当然,值相同的动态常量与我们通常说的常量只是来源不同,但是都是储存在池内同一块内存区域。Java语言并不要求常量一定只能在编译期产生,运行期间也可能产生新的常量,这些常量被放在运行时常量池中。这里所说的常量包括:基本类型包装类(包装类不管理浮点型,整形只会管理-128到127)和String(也可以通过String.intern()方法可以强制将String放入常量池)

    String.intern() 检查字符串常量池中是否存在String并返回池里的字符串引用;若池中不存在,则将其加入池中,并返回其引用。这样做主要是为了避免在堆中不断地创建新的字符串对象

    JDK1.7中JVM把String常量区从方法区中移除了;JDK1.8中JVM把String常量池移入了堆中,同时取消了“永久代”,改用元空间代替(Metaspace)。

  • JVM为每个已加载的类型都维护一个常量池。常量池就是这个类型用到的常量的一个有序集合,包括实际的常量(string,integer,和floating point常量)和对类型,域和方法的符号引用。池中的数据项象数组项一样,是通过索引访问的。

  • 方法区主要有以下几个特点:

    1、方法区是线程安全的。由于所有的线程都共享方法区,所以,方法区里的数据访问必须被设计成线程安全的。例如,假如同时有两个线程都企图访问方法区中的同一个类,而这个类还没有被装入JVM,那么只允许一个线程去装载它,而其它线程必须等待

    2、方法区的大小不必是固定的,JVM可根据应用需要动态调整。同时,方法区也不一定是连续的,方法区可以在一个堆(甚至是JVM自己的堆)中自由分配。

    3、方法区也可被垃圾收集,当某个类不在被使用(不可触及)时,JVM将卸载这个类,进行垃圾收集。

    作者:冰河winner 来源:CSDN 原文:blog.csdn.net/u012152619/… 版权声明:本文为博主原创文章,转载请附上博文链接!

二、堆

Java堆是被所有线程共享的,用来存放所有所有被实例化的对象

Java堆的新生代和老年代

三、程序计数器

  • 程序计数器为各个线程所私有
  • 程序计数器实际上是一个(字节码的)行号指示器
  • 执行native方法为空

四、虚拟机栈

  • 虚拟机栈为各个线程所私有
  • 声明周期与线程相同
  • 每个Java方法执行时创建一个帧栈

1、帧栈里面存了啥?

  • 局部变量表
  • 操作栈
  • 动态链接
  • 方法出口

五、本地方法栈

本地方法栈(Native MethodStacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native 方法服务。

(未完。。。。)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值