002 java内存分配

java内存分配图

alt

java栈

存放基本数据类型、对象的引用、方法的入口;每个线程包含一个栈区【线程独享空间】

优点:存取速度快,数据共享

缺点:栈中的数据大小和生存期都是确定的,缺乏灵活性

存放new出来的对象(为对象的成员变量分配内存空间,但对象共享该类的方法 )和数组,JVM只有一个堆区【线程共享空间】

优点:可以动态分配内存的大小,生存期也不必事先告诉编译器,由java回收器自动回收不再使用的数据(无引用数据)

缺点:程序运行时动态分配内存,存取速度慢

方法区:静态区、常量池

存放常量(基本数据类型、字符串常量)、静态成员(static)、加载的类信息(类的名称、方法信息、字段信息及编译器编译后的代码等)【线程共享空间】

本地方法栈

  本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。

程序计数器区

  在JVM中,多线程是通过线程轮流切换来获得CPU执行时间的,因此,在任一具体时刻,一个CPU的内核只会执行一条线程中的指令,为了能够使得每个线程都在线程切换后能够恢复在切换之前的程序执行位置,每个线程都需要有自己独立的程序计数器,并且不能互相被干扰,否则就会影响到程序的正常执行次序。因此,程序计数器是每个线程所私有的。

线程共享问题

  JVM初始运行的时候会分配好 Method Area(方法区) 和Heap(堆) ,而JVM 每遇到一个线程,就为其分配一个 Program Counter Register(程序计数器) , VM Stack(虚拟机栈/java方法栈)和Native Method Stack (本地方法栈), 当线程终止时,三者所占用的内存空间也会被释放掉。这也是为什么把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说只发生在Heap上)的原因。

栈的数据共享问题

栈有一个很重要的特殊性,就是存在栈中的数据可以共享,有利于节省空间。
例:

int a = 3;
int b = 3;
//这两句本质是在栈分配了一块内存空间,存放了3,不过这块内存空间有两个别名,为a和b。

编译器处理过程:
  编译器先处理int a = 3;首先在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没有,就将3存放进来,然后将a指向3。接着处理int b = 3;在栈中创建变量b的引用后,因为在栈中已经有3了,将b直接指向3。这样就实现了数据共享。

注意:两个基本数据类型的数据共享与两个对象的引用指向同一对象的数据共享是不同的;因为a的值改变不会影响b的值,而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

H J

你的鼓励就是我的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值