最近在牛客写了几道字符串的题目,总是出现错误。仔细想想发现都是关于
Java内存方面的问题,所以我打算写一篇文章来梳理一下知识点。
Java内存结构包含以下部分:
1、栈区:由编译器自动分配释放,具体方法执行结束后,系统自动释放JVM内存资源。
其作用有保存局部变量的值,包括:1.用来保存基本数据类型的值;2.保存类的实例,即堆区对象的引用。也可以用来保存加载方法时的帧。
2、堆区:一般由程序员分配释放,JVM不定时查看这个对象,如果没有引用指向这个对象就回收。
其作用为用来存放动态产生的数据,包括new出来的实例,字符数组等。
同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法。
3、数据区:用来存放static定义的静态成员。
4、常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括 基本常量(基本类型),对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号:
- 类和接口的全限定名;
- 字段的名称和描述符;
- 方法和名称和描述符。
引用池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中(Method Area)。
下面看一道经典例题:
我们额外添加一种情况:
String f = "c";
String g = "ab" + "c";
f 没有创建对象,因为这一句等价于
String = "abc";