1.自己建立一个String类,再String s = new String("13")会怎么样
根本找不到 main 方法,没法运行,IDEA中类前面的运行按钮都不见了
String类有final修饰符,而final修饰的类是不能被继承的
2.String s = new String("xyz");创建了几个StringObject?
两个或一个都有可能,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它使用常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,那么这里就不会创建”xyz”了,直接从缓冲区拿,这时创建了一个StringObject;但如果以前没有用过"xyz",那么此时就会创建一个对象并放入缓冲区,这种情况它创建两个对象。
3.String s = "a"+"b"+"c"+"d"; //创建了几个对象
答案:1个
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");//false
System.out.println(s3 == "ab");//true
第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期再去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
4.JVM堆内存结构分配
JVM的堆内存分为新生代和旧生代。新生代分为Eden区和JVM的堆内存分为新生代和旧生代。新生代分为Eden区和Survivor区。Survivor区分为From和To
5.当对象A创建之后,对象A在各个区之间的流转过程
1.对象A被new出来之后,是被存放在Eden区的(Eden即伊甸园,亚当和夏娃的故事)
2.当发生一次GC之后,Eden区存活下来的对象A会被复制到Survivor的To,并且Survivor的From存活的对象也会复制到Survivor的To
3.清空Eden和Survivor的From
4.交换Survivor的From和To,保证在GC发生之前,To永远是空的那个
5.下次GC发生时,重复上述步骤.
注意:根据这个对象在Survivor区中存活了多久而决定去向,当一个对象在Survivor中存活了很久(即经历了多次GC还没死),就会在发生GC时被复制到旧生代中。
6.判断对象死活
引用计数算法
引用计数算法是给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,;当引用失效时,计数器值就减1。计数器的值为0就表示这个对象已经“死去”
可达性分析算法
被称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的
7.什么样的对象才可以作为GC Roots的对象呢?
虚拟机栈(栈帧中的本地变量表)中引用的对象
方法区中类静态属性引用的变量
方法区中常量引用的对象
本地方法栈中JNI(即一般说的Native方法)引用的对象
概括就是3个地方引用的对象 变量表 静态类属性或常量 Native方法
8.Java字节码(.class)文件存储在数据域哪
方法区
9.各数据区的作用
- 栈:为即时调用的方法开辟空间,存储局部变量值(基本数据类型),局部变量引用。注意:局部变量必须手动初始化。
- 堆:存放引用类型的对象,即new出来的对象、数组值、类的非静态成员变量值(基本数据类型)、非静态成员变量引用。其中非静态成员变量在实例化时开辟空间初始化值
- 方法区:存放class二进制文件。包含类信息、静态变量,常量池(String字符串和final修饰的常量值等),类的版本号等基本信息。因为是共享的区域,所以如果静态成员变量的值或者常量值被修改了直接就会反应到其它类的对象中。
- 程序计数器:当前线程所执行的字节码的行号指示器
- 本地方法栈:为Native方法服务
网友评论