JVM简单知识,区分数据位置
程序计数器:如分支,循环,跳转,异常处理,线程恢复等基础功能都依赖于程序计数器栈:(细分分为虚拟机栈和本地方法栈)1 基础数据类型 byte short int long float double char boolean2 方法的形式参数,方法调用完后从栈空间回收3 引用对象的地址,引用完后,栈空间地址立即被回收,堆空间等待GC堆,只有一个切被所有线程共享(有时候被称为GC堆)1 t...
·
程序计数器:如分支,循环,跳转,异常处理,线程恢复等基础功能都依赖于程序计数器
栈:(细分分为虚拟机栈和本地方法栈)
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
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)