堆内存

C/C++ 堆和栈的区别

耗尽温柔 提交于 2019-11-26 04:59:54
预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。 - 程序结束后由系统释放。 文字常量区:常量字符串就是放在这里的。 程序结束后由系统释放 程序代码区:存放函数体的二进制代码。 例如: #include "stdio.h" int a = 0;//全局初始化区 char *p1;// 全局未初始化区 void main(void) { int b; // 栈 char s[] = "abc"; // 栈 char *p2; // 栈 char *p3 = "123456"; // 123456/0在常量区,p3在栈上。 static int c =0;// 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。

JVM堆内存参数优化,让性能飞起来

為{幸葍}努か 提交于 2019-11-26 01:14:18
堆内存是Java进程的重要组成部分,几乎所有与应用相关的内存空间都和堆有关。现在主要介绍与堆内存相关的参数设置,这些参数对Java虚拟机中非常重要的,也是对程序性能有着重要的影响。让你彻底脱离OOM内存溢出等等带来的程序崩溃。 1、 -Xms 初始堆内存大小,当Java进程启动时,虚拟机会分配一块初始堆空间,可以使用-Xms指定这块空间大小。在实际工作中,我们一般把-Xms与-Xmx的值设置为相等,这样的好处是在程序运行时减少GC的次数,从而提高程序性能。 2、 -Xmx 当程序在运行时,堆初始空间消耗殆尽,虚拟机会对堆空间进行扩展,其扩展上限是最大堆空间,使用-Xmx参数来指定。(方便大家好记住,这里mx可以暂时理解为max最大) 3、-Xmn 此参数是用来指定新生代的大小(堆内存是分为新生代, 老年代,永久带-在jdk1.8后移除此属性),新生代分为Eden、from、to空间。设置一个较大新生代会降低老年代的大小,这个参数设置对系统性能已经GC行为有极大的影响。 新生代一般设置为堆内存的1/3-1/4左右。 4、-XX:SurvivorRatio 用来设置新生代中Eden空间和from/to空间的比例关系,表达式如下:-XX:SurvivorRatio=eden/from=eden/to。 5、-XX:NewRatio 可以设定老年代与新生代的比例。 示意图如下: 来源:

C++的栈空间和堆空间

久未见 提交于 2019-11-25 20:08:49
https://www.csdn.net/gather_2b/NtDaIg5sMTktYmxvZwO0O0OO0O0O.html 一直都把堆栈放一起,所以很多人会误以为他们的组合是一个词语,就像“衣服”一样简单,其实不然,今天在下就将最近学习总结的一些与大家分享。 一个由C/C++编译的程序占用的内存分为以下几个部分: 1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈。 2、堆区(heap):一般是由程序员分配释放,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的堆是两回事,分配方式倒是类似于数据结构的链表。 3、全局区(static):也叫静态数据内存空间,存储全局变量和静态变量,全局变量和静态变量的存储是放一块的,初始化的全局变量和静态变量放一块区域,没有初始化的在相邻的另一块区域,程序结束后由系统释放。 4、文字常量区:常量字符串就是放在这里,程序结束后由系统释放。 5、程序代码区:存放函数体的二进制代码。 堆和栈的区别: 一、由以上综述就可以得知,他们程序的内存分配方式不同。 二、申请和响应不同: 1、申请方式:stack由系统自动分配,heap需要程序员自己申请,C中用函数malloc分配空间,用free释放,C++用new分配,用delete释放。 2、申请后系统的响应: 栈