zoukankan      html  css  js  c++  java
  • 堆栈内存申请,以及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之间。

  • 相关阅读:
    0593. Valid Square (M)
    0832. Flipping an Image (E)
    1026. Maximum Difference Between Node and Ancestor (M)
    0563. Binary Tree Tilt (E)
    0445. Add Two Numbers II (M)
    1283. Find the Smallest Divisor Given a Threshold (M)
    C Primer Plus note9
    C Primer Plus note8
    C Primer Plus note7
    C Primer Plus note6
  • 原文地址:https://www.cnblogs.com/pkjplayer/p/6653145.html
Copyright © 2011-2022 走看看