Jvm运行时区域分配

jvm栈堆运行时区域分配
(1)本地方法栈
(2)方法区
(3)堆
                              { 当前栈帧
(4)虚拟机栈—{ 局部变量表
                              { 操作数栈
                              { 动态连接
                              { 返回地址
                              { 栈帧N
(5)程序计数器



线程私有,不共享生命周期。
每个方法在执行时都会创建一个栈帧,用于存放局部变量。
每个方法从调用到执行完成,都对应一个虚拟机入栈到出栈的过程。
内存空间连续,速度快。

所有线程共享
所有对象实例以及数组(引用类型)都在堆中分配
内存空间不连续,速度慢,但灵活。

局部变量和成员变量的分配
局部变量
引用类型:变量名(即地址)存放在栈,实例存放在堆。地址值在栈,所以随着方法结束,系统会释放方法栈,其对应在该方法中声明的变量(局部变量)会随着栈的销毁而结束
基本数据类型:局部变量名(地址)和值都存放在栈,成员变量名(地址)和值都存放在堆。
成员变量
引用类型:其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象都存储在相应的堆中。
基本数据类型:变量名及其值都存放在堆内存中。
栈是私有,而成员变量是所有线程共享,所以成员变量不会存放在栈中。


基本数据类型: byte(1个字节),short(短整型2个字节),char(4个字节)int(四个字节)float(4个字节)long(长整型8个字节)double(8个字节),boolean(8个字节)
异同:

引用类型的实例无论是成员变量还是局部变量,都是存放在堆 成员变量引用的地址值跟随实例存放在堆。局部变量变量名(地址)存放在栈,实例存放在堆

对象new出来后,实例存放在堆,对象的成员变量已经在堆上分配了空间。对象里面的方法是没有出现的,只出现方法的声明。等对象调用方法时,局部变量才会在栈中创建,所以方法中的局部变量是存放在栈中的。

静态变量存放于方法区中


方法区

1.各个线程共享资源,存储.class文件、常量、静态变量、即时编译器编译后的代码等数据、运行时常量池

2.虚拟机把方法区描述为堆的一个逻辑部分,有一个别名Non-Heap(非堆)

3.静态常量池,即*.class(字节码)文件中的常量池,class文件中的常量池不仅仅包括字符串(数字)字面量,还包括类、方法的信息,占用class文件的绝大部分空间。

4.运行时常量池,是jvm虚拟机在完成某种装载操作后,将class文件中的常量池载入到内存中,并保存到方法区中,我们常说的常量池就是方法区中的运行时常量池.


程序计数器

1.一块郊县的内存空间,线程私有不共享

2.在任何一个确定时刻,一个处理器都只会执行一条线程中的指令,每条线程都有独立的程序计数器,互不影响独立存储

3.此内存区是唯一一个在java虚拟机里没有规定任何OutMemoryError的区域


本地方法栈

本地方法栈和虚拟机栈相似,区别就是虚拟机为虚拟机栈执行JAVA服务(字节码服务),而本地方法栈为虚拟机使用到的Native方法服务,本地方法栈使用的语言、方式、数据结构没有强制要求,有具体虚拟机自由实现它.


String(特殊)(引用类型) String s1 =new String();

在程序编译时,编译程序先去字符串常量池检查,是否存在字符串,如果不存在,则在常量池中开辟一个内存空间存放字符串,如果有的话,不用开辟。保证常量池中只有一个字符串常量,节省内存空间。然后在内存堆中开辟一块空间存放new出来的String实例,在栈中开辟一块空间,命名为“s1”,存放的值是堆中String实例的内存地址,这个过程就是将引用s1指向new出来的String实例


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值