Java学习笔记——JVM(2)内存结构

1. JVM的内存区域划分

这是个老生常谈的问题了,一般来说,JVM的内存区域包括以下几部分:

(1)堆(Java堆)Heap:存放对象实例的成员变雷的值(不存方法)

(2)方法区 Method Area:包括永久代(元空间)以及有关于类的一些元数据,包括类加载器的引用、常量池、字段数据、方法数据、方法代码等

(3)栈(虚拟机栈) VM Stack:每个方法被执行一次的时候创建一个栈帧,存储局部变量表、操作栈、动态链接、方法出口等

(4)本地方法栈 Native Method Stack:与VM栈类似,区别在于这里调用的方法为本地方法(非Java编写的方法)

(5)程序计数器 :当前线程所执行的字节码的行号指示器

其中,堆和方法区为线程共享,栈为线程独占

 

2. JVM的执行流程

(0)java源码被编译为字节码,然后加载到JVM中,类加载的过程中,类的一些元数据被存储在方法区-元空间中;

(1)JVM找到类的入口(main函数),为main函数创建栈帧,开始执行main函数;

(2)遇到没有加载到JVM中的类,先加载到JVM中,步骤同上;

(3)创建的实例存放在堆中,对象引用存放在栈中,然后调用构造函数初始化该实例,这个实例有指向方法区的关于该类元信息的引用;

(4)调用对象方法时,根据栈中对象的引用找到堆中的对象实例,再从对象实例指向方法区中该类的元数据中找到方法表,获得调用方法的字节码的地址;

(5)为上一步调用的方法创建栈帧,开始运行该方法。

 

3. JVM中的常量池

常量池的存在是为了解决一些使用频率很高的常量被频繁创建和销毁带来的性能问题,实现常量对象的共享(Python中也有类似的机制)。

至于常量池在JVM中占用的内存区域,不同版本JDK有较大的变化:

JDK版本<=1.6:方法区(永久代)

JDK版本==1.7:堆

JDK版本>=1.8:字符串常量池在堆中,运行时常量池和静态常量池在元空间(方法区)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值