1、网上有用str==str.intern(),这种方法只能判断该引用是否指向常量池,无论字面量或new String,在intern前后都返回true或false,并无改变。
2、编译阶段编译器是否将字面量存到常量池中?也就是说在程序还没开始运行,甚至类还没加载,常量池中就有值了?
3、new String只在堆区开辟空间,以char[]或byte[]方式在堆区存储,但new String("abc")后括号内的abc也是字面量,根据2,堆和栈中都有值。(两个对象).java文件到.class文件的或称叫编译,执行引擎中还有JIT编译器?求大佬解释

解决方案 »

  1.   

    有个方法:可以在方法结束之前打个断点,或者无限循环,然后通过工具监控这个Java进程,分析其内存。
      

  2.   

    1.intern方法在不同的jdk版本其实现不同1.7与1.8,自己去了解
    2.程序真正运行是加载.class文件,编译只是将java文件转为class文件,并且改class文件可以在在任意符合版本的jvm运行,所以常量池中有值是在类加载才会有的。
      

  3.   

    3.每new一个对象在堆和栈中都有内存消耗,在堆空间中保存类的信息,在栈空间中保存类的引用(地址信息),栈帧销毁(例如方法返回)栈空间信息删除,堆空间信息还在,等待jvm垃圾回收
    4.传统的类加载是解释执行将class文件解释一行执行一行,而jit即时编译是将class文件一次性全部进行编译完成然后执行