Java和C++内存机制的差别

19 篇文章 0 订阅
Java的内存管理实质上就是JVM的内存管理

  JVM的内存分为两部分:stack和heap

  Stack(栈)是指JVM的内存指令区。Java基本数据类型,Java指令代码,常量都存在stack中。

  heap(堆)是JVM的内存数据区。heap专门用来保存对象的实例,实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中),对象实例在heap中分配好后需要在Stack中保存1个4字节的heap内存地址,用来定位该对象在heap中的位置,以便找到该对象实例。

  Stack不存在内存管理问题,系统自动管理,heap中的对象由GC负责垃圾回收。

  GC垃圾收集的规程:GC进程定期扫描heap,他根据stack中保存的4字节对象地址扫描heap,定位heap中的这些对象,进行一些优化,并且假设heap中的没有扫描到区域都是空闲的,统统refresh(实际上是把stack中丢失对象地址的无用对象清除了)。这就是垃圾回收的过程。

  关于对象

  1、方法本身是指令的操作码部分,报存在stack中;

  2、方法内部变量作为指令的操作数部分,跟在指令的操作码之后,保存在stack中(实际上是简单类型保存在stack中,对象实例在stack中保存地址,在heap中保存值)

  上述的指令操作数和指令操作码构成完整的Java指令。

  3、对象实例包括属性值作为数据,保存在heap中。

  关于静态方法和静态属性

  当一个ClassLoader load进入JVM后,方法指令报存在stack中,此时heap区没有数据,然后程序计数器开始执行指令,如果是一个静态方法,直接依次执行指令代码,当然此时指令代码无法访问heap数据区;如果是非静态方法,由于隐含参数没有值,会报错。因此在非静态方法执行之前,要先new对象,在heap中分配数据,并把stack中的地址指针交给非静态方法,这样程序计数器一次执行指令,而指令代码就能够访问到heap数据区。

  由于上述的原因,静态属性是 保存在stack中的(基本类型报存在stack,对象类型地址保存在stack中,值报存在heap中),并因此具有全局属性。

  补充:字符串常量在stack分配,this在heap中分配,数组想对象一样既在stack中分配地址放数组名称,又在heap中分配数组实际大小的空间。

  下面再说C/C++内存管理

  在C++中,内存分为5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

  栈:编译器自动管理,里面的变量是局部变量、函数参数等(可以用alloca函数分配)

  堆:由new分配的内存块,用delete释放

  自由存储区:由malloc分配,用free释放和堆很相似

  全局/静态存储区:全局变量和静态变量

  常量存储区:常量

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值