string abc = new String("abc")

string abc = new String("abc")

运行时创建了几个变量?

当常量池中存在该变量时,创建一个,即直接在堆内存空间创建

当常量池中不存在该变量时,即在常量池空间创建一个,之后在堆内存空间创建一个

string abc = new String("abc")

 为什么会创建一个常量池,为什么字符串不像其它对象那样存储在堆内存中?

1.所有的字符串字面量都被存储在一个称为字符串常量池 

2.通常,在一个 Java 业务应用程序会创建并处理成千上万个字符串对象,这些字符串对象中有许多具有相同的值或者是中间操作字符而非最终结果。如果我们将所有这些字符串对象存储在堆内存中,仅仅是存储这些字符串对象就需要占用大量的堆内存 .

3.为了避免 ,JVM 首先创建大量的字符串对象,然后再进行垃圾回收。 JVM 将所有字符串字面量存储在称为字符串常量池的单独内存区域中,并重用该高速缓存池中的对象 

 

 JVM运行时候内存模型

string abc = new String("abc")



 

 

string abc = new String("abc")

 

 

 一个.java是怎么运行的

1.javac编译成class文件

2.之后的操作交给JVM

JVM中

方法区:存放的是被加载的class文件相关信息,

堆:当程序运行时,JVM虚拟机会把程序运行时创建的结果放在堆中

PC寄存器:主要用来存储线程,当创建新的线程时.该线程得到的一个是自己的PC寄存器,一个java栈

本地方法区:存本地的非Java方法,由执行引擎负责调用

栈区:用来存储值类型的,如基本数据类型,String是引用数据类型,是存储在堆中,java栈是由很多栈帧组成的,一个栈帧中包含有java方法调用状态,当线程调用一个方法时,虚拟机压入一个新的栈帧到该线程的java栈

 

 

 

 

 

 

 

 

 

**[``]()**

上一篇:Linux操作系统


下一篇:浏览器跨域情况