Java校招面试题目合集-day04

    技术2022-07-10  106

    finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?

    参考答案

    垃圾回收器(garbage collector)决定回收某对象时,就会运行该对象的finalize()方法 但是在Java中很不幸,如果内存总是充足的,那么垃圾回收可能永远不会进行,也就是说filalize()可能永远不被执行,显然指望它做收尾工作是靠不住的。 那么finalize()究竟是做什么的呢?它最主要的用途是回收特殊渠道申请的内存。Java程序有垃圾回收器,所以一般情况下内存问题不用程序员操心。但有一种JNI(Java Native Interface)调用non-Java程序(C或C++),finalize()的工作就是回收这部分的内存。

     

    如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?

    参考答案

    不会,在下一个垃圾回收周期中,这个对象将是可被回收的。

    Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?

    参考答案

    JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。

    堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。

    永久代是用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类,永久代中一般包含:

    类的方法(字节码...)类名(Sring对象).class文件读到的常量信息class对象相关的对象列表和类型列表 (e.g., 方法对象的array).JVM创建的内部对象JIT编译器优化用的信息

     

    串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?

    参考答案

    吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。

    在Java中,对象什么时候可以被垃圾回收?

    参考答案

    当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。

    JVM的永久代中会发生垃圾回收么?

    参考答案

    会,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下Java8:从永久代到元数据区

    (注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区)

    Java中的两种异常类型是什么?他们有什么区别?

    参考答案

    Java中有两种异常:受检查的(checked)异常和不受检查的(unchecked)异常。不受检查的异常不需要在方法或者是构造函数上声明,就算方法或者是构造函数的执行可能会抛出这样的异常,并且不受检查的异常可以传播到方法或者是构造函数的外面。相反,受检查的异常必须要用throws语句在方法或者是构造函数上声明。这里有Java异常处理的一些小建议。

    Java中Exception和Error有什么区别?

    参考答案

    Exception和Error都是Throwable的子类。Exception用于用户程序可以捕获的异常情况。Error定义了不期望被用户程序捕获的异常。

    throw和throws有什么区别?

    参考答案

    1、Throw用于方法内部,Throws用于方法声明上

    2、Throw后跟异常对象,Throws后跟异常类型

    3、Throw后只能跟一个异常对象,Throws后可以一次声明多种异常类型

     

    异常处理完成以后,Exception对象会发生什么变化?

    参考答案

    Exception对象会在下一个垃圾回收过程中被回收掉。

    Processed: 0.012, SQL: 9