java面试强基(16)

java面试强基(16)_第1张图片

目录

clone方法的保护机制

Java中由SubString方法是否会引起内存泄漏?

Java中提供了哪两种用于多态的机制? 

程序计数器(线程私有) 

如何判断对象是否是垃圾? 


clone方法的保护机制

clone0方法的保护机制在Object中是被声明为 protected的。以User类为例,通过声明为protected就可以保证只有User类里面才能“克隆”User对象。

Java中由SubString方法是否会引起内存泄漏?

在JDKl.6中, String类中存储了三个重要的属性: char[]value、offSet和intcount,分别用来表示字符串对应的字符数组、数组的起始位置及String中包含的字符数。由这三个变量就可以唯—决定一个字符串。在调用SubString方法的时候,虽然会创建1个新的字符串,但是新对象的value仍然会使用原来字符串的value属性。只是count和of fset的值不一样而已。

虽然字符串在堆中是1个新的对象,但是它与原字符串都指向了相同的字符数组。对于垃圾回收器来说,这个字符数组仍然被使用,因此无法回收。“Helloworld”这个字符串虽然不被使用了, 但是仍然无法被垃圾回收器回收,因此就造成了内存泄漏。

substring() 方法返回字符串的子字符串。

java面试强基(16)_第2张图片

 java面试强基(16)_第3张图片

public class RunoobTest {
    public static void main(String args[]) {
        String Str = new String("This is text");
 
        System.out.print("返回值 :" );
        System.out.println(Str.substring(4) );
 
        System.out.print("返回值 :" );
        System.out.println(Str.substring(4, 10) );
    }
}

java面试强基(16)_第4张图片

Java中提供了哪两种用于多态的机制? 

编译时多态和运行时多态。编译时多态是通过方法重载实现的,运行时多态是通过方法重写(子类覆盖父类万法)实现的。

多态成员变量:编译运行看左边
         Fu f=new Zi();

         System.out.println(f.num);//f是Fu中的值,只能取到父中的值

多态成员方法:编译看左边,运行看右边

        Fu f1=new Zi();

        System.out.println(f1.show());//f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法

程序计数器(线程私有) 

一块较小的内存空间, 是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程私有” 的内存。

正在执行 java 方法的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址) 。如果还是 Native 方法,则为空。

这个内存区域是唯一一个在虚拟机中没有规定任何 OutOfMemoryError 情况的区域。

如何判断对象是否是垃圾? 

引用计数:在对象中添加一个引用计数器,如果被引用计数器加 1,引用失效时计数器减 1,如果计数器为 0 则被标记为垃圾。原理简单,效率高,但是在 Java 中很少使用,因为存在对象间循环引用的问题,导致计数器无法清零。

可达性分析:主流语言的内存管理都使用可达性分析判断对象是否存活。基本思路是通过一系列称为 GC Roots 的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程走过的路径称为引用链,如果某个对象到 GC Roots 没有任何引用链相连,则会被标记为垃圾。可作为 GC Roots 的对象包括虚拟机栈和本地方法栈中引用的对象、类静态属性引用的对象、常量引用的对象。

你可能感兴趣的:(java面试,java,jvm,开发语言)