堆 栈 常量池 --C与JAVA对比 纯小白笔记
预备知识:
Q1.两个new string地址值会相等吗?
不会。是因为我们“new”一个对象的时候,内存会在堆里为它开劈一个新的内存空间。
链接:https://baijiahao.baidu.com/s?id=1616217269725946631&wfr=spider&for=pc。
JVM虚拟内存分布:
上述图像若过于抽象,则通过买房子构建内存 堆栈 概念
知乎链接 https://www.jianshu.com/p/dbad2ec8b290
JAVA中:
栈:存放基础类型。byte short int long float double bool char
堆:存放引用类型。数组,类,接口,引用类型变量存在栈,对象存在堆,通过引用确定关系。
方法区:
常量池:
静态常量池:所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。
动态常量池:由上图可以看出方法区内只含有运行时常量池。运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。
C:
C++程序占用的内存总共分为5部分:栈区(局部变量)、堆区(malloc)、全局/静态存储区(全局变量、静态变量)、常量区(常量)和代码区(代码)。
栈:和java栈类似
常量区:和java常量池类似
堆:C语言中的堆是malloc赋值得来的
字符串是放在常量池的,字符串是不可以修改的所以和final修饰的常量一样,当你定义一个字符串的时候如String str = “nihao”; 他会先去常量池找有没有“nihao”,如果有就直接指向他,没有会在常量池中建一个。
数组在JAVA和C中存储方式不同
C语言:
malloc或new的数组存在堆中
不带static前缀的局部数组在栈中
带static前缀的局部数组和全局数组在全局数据区中
char s1[] = “hello1”;
char *s2 = “hello2”;
区别如下:
1)存储区域不同
s1、s2均存储在栈中;
"hello1"存储在栈中,因为它是一个字符串数组;
"hello2"存储在常量存储区;(和JAVA字符串相同)
JAVA
JAVA数组都是放在堆中。而字符串是放在常量池的,字符串是不可以修改的所以和final修饰的常量一样,当你定义一个字符串的时候如String str = “nihao”; 他会先去常量池找有没有“nihao”,如果有就直接指向他,没有会在常量池中建一个。