操作系统的三种内存分配方式:
1.静态内存分配策略
在编译时就能确定运行时的内存需求。
2.栈内存分配策略
在运行时确定内存需求。
3.堆内存分配策略
在运行中到相应代码的时候才确定需要的内存空间大小
JAVA中的内存分配:
1.JAVA栈的内存分配:
JAVA栈是和线程绑定在一起的,一个线程的方法的调用和返回对应于这个java栈的压栈和出栈。当线程激活一个方法时,JVM就会在线程的Java堆栈中新压入一个帧,这个帧自然是在栈的顶部,并且处于活动状态。在这个方法的执行期间,这个帧将会用来保存参数,局部变量,中间计算过程和其他数据。
栈中主要昂一些基本类型变量数据(如 int,short,long,byte,float,double,boolean,char)和对象句柄(引用)。存取速度比堆更快,仅次于寄存器,栈数据可以共享。缺点是:存在栈中数据的生命周期必须是确定的,这样也导致了其缺乏灵活性。stack的大小时在编译时确定的,运行时无法改变。
2.JAVA堆的内存分配:
每个Java应用都对应一个JVM实例,每个实例都对应一个堆。应用程序在运行中创建的所有类实例或数组都放在这个堆中,并由应用程序所有的线程共享。建立一个对象会分别在栈中存放这个对象的指针,在堆中实际建立这个对象。堆的优势是可以动态分配内存大小,生命周期也不需要告诉编译器,但是缺点正式因为需要动态分配内存,导致其速度较慢。heap的大小是动态分配的,不够时需要向操作系统再请求。