运行时数据区域
1.程序计数器
可以看作当前线程的字节码的行号指示器,通过改变计数器的值来选取下一条需要执行的字节码指令,每条线程都需要一个独立的计数器;如果线程执行的是Java方法,计数器指示当前字节码指令的地址,如果执行Native方法则计数器为空
2.Java虚拟机栈
线程私有,生命周期与线程相同。当执行一个Java方法时,会为这个方法生成一个栈帧(包含局部变量表,操作数栈,动态链接,方法出口等信息),然后将栈帧推入虚拟机栈,方法的调用和结束对应着栈帧的入栈和出栈
3.本地方法栈
与Java虚拟机栈类似,不过执行的是Native方法;有些虚拟机可能是将两个栈合在一起的
4.Java 堆
线程共享的区域,几乎所有对象都在这里分配空间,是垃圾收集的主要地方,也叫GC堆,1.6之后运行时常量区放在堆里面。
5.方法区
用于存放已经静态变量、即时编译器编译后的代码等。
关于String的intern()方法:
String str = "Hello world"; String str1 = new String("Hello") + new String("World");
str1.intern()表示如果常量池中已存在该常量则返回常量池中代表该字符串的对象,如果不存在则将该String对象的引用放入常量池中,并且返回该对象的引用