程序计数器:如分支,循环,跳转,异常处理,线程恢复等基础功能都依赖于程序计数器

栈:(细分分为虚拟机栈和本地方法栈)
1 基础数据类型 byte short int long float double char boolean
2 方法的形式参数,方法调用完后从栈空间回收
3 引用对象的地址,引用完后,栈空间地址立即被回收,堆空间等待GC

堆,只有一个切被所有线程共享(有时候被称为GC堆)
1 this,new出来的对象实例
2 数组

方法区(又叫 静态区,Non-Heap,非堆)
1 常量
2 静态变量
3 所有的class信息
4编译器编译后的代码

常量池(从jdk1.7开始,字符串常量池被移动到java堆),是方法区的一部分
编译器生成的符号引用和字面量
String的intern方法可以在运行期将常量放入池中

直接内存

我直接做个例子吧

public class Main {
public static int a;   //方法区
public static void main(String[] args) {
int i=1;      //栈中

String a1=new String("hello");      //堆中
String a2="hello";        //常量池中
String a3="he"+"llo";     //因为是2个常量拼接所以在常量池中
String a4="he"+new String("llo");  //常量池中的元素与堆中元素拼接,最后放在常理池中

System.out.print(a1==a4);  //这里使用了程序计数器,对比过程就不详细解释了,结果肯定是false
	
	
}
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐