• 堆栈内存申请,以及32位程序内存上限


    1)堆栈内存申请

    提起内存,我们常常想到三个区域:

    1.静态区,静态变量 static variables / constant  ,常量,静态变量就存储在静态区域,这个区域比较简单,只需要知道怎么通过地址访问他就行了。

    2.堆 动态变量 关键字new 。通过new 创建的对象,会存储在堆中。 java中当new的对象不再被引用时候,垃圾回收器就会在适当的时候回收这部分内存。在C/C++中则需要手动释放。

      对于C,,则调用malloc,realloc,calloc申请 free 来释放。

    3.栈,局部变量 创建的值会存储在栈中。

    总结:栈(satck):由系统自动分配。堆(heap):需程序员自己申请,并指明大小,并由程序员进行释放。容易产生内存泄漏。

    我们看看计算机中静态区域、堆、栈在内存中图示:

    我们试着来分析一段Java代码,来看看内存究竟是如何分配的。

    先看看代码,代码很简单:

     1 class Point {  
     2     private int px;  
     3     private int py;  
     4     public Point(int x, int y) {  
     5     px = x;  
     6     py = y;   
     7     }  
     8   
     9     public void move(int dx, int dy) {  
    10     px += dx;  
    11     py += dy;  
    12     }  
    13 }  
    14   
    15 public class Test {  
    16     public void test() {  
    17     Point p1 = new Point(2, 3);  
    18     Point p2 = new Point(4, 5);  
    19     p1.move(10, 11);  
    20     }  
    21 }  

    看清楚上面方法后,接着分析调用test方法:

    程序在运行到test方法第一行时,由于有new,在堆上,我们申请了内存,在1004位置上存了2,在1008位置上存了3,overhead部分是一些额外的内存开销,在此我们不关注。在栈上,我们FFFC位置上存储了刚才在堆上创建的对象的首地址。同理,test第二句也是这样执行。如下图所以,该图就是test方法前俩句执行完毕后,在堆、栈的样子。

    接着,调用了p1.move(10, 11),从上图看,这时我们要调用他,首先在栈上创建的是对象指位器,也叫this指位器。这个this是用来做什么的呢?this用来指示对象本身,他是如何指向本身的,下图中可以明了的看出,this右边就是指向当前对象的地址,也就是下图中的红色区域。

    接着,我们可以得到dx,dy,注意栈是向上分配的,也就有了下图中的表示,他们的值分别是10,11。这时候我们才真正进行move动作,也就是加数值操作,先move方法第一行,我们把dx的值加到px上。第二行同理。

    该方法执行完毕了,我们知道,当栈上的变量停止访问,也就是他不在用了,操作系统就会对这段内存进行回收。即出栈操作,执行完出栈操作后,下图中黄色的部分也就消失了。假如接着还有其他方法执行,这时候就在FFF8地址之前,也就上面继续进行。

    2)32位程序内存申请上限

    在windows,64位系统中测试,32位程序内存申请上限大小在1.5G——1.6G之间。

  • 相关阅读:
    Bower 使用
    为什么是static?
    多重继承 -Javascript中的apply与call详解
    留用 未验证 js适配根字体大小
    Js作用域与作用域链详解
    理解AngularJS中的依赖注入
    渐进增强 优雅降级
    前后台数据交换的几种方式:
    then()方法是异步执行
    HTML怎么让img 等比例缩放
  • 原文地址:https://www.cnblogs.com/pkjplayer/p/6653145.html
Copyright © 2020-2023  润新知