from 牛客网 持续更新中...
Java 基础
1. 关于抽象类与接口,下列说法正确的有?
为了降低模块的耦合性,应优先选用接口,尽量少用抽象类
抽象类可以被声明使用,接口不可以被声明使用
抽象类和接口都不能被实例化。
答案:AC
解析
含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class
类中定义抽象方法必须在具体
(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
下面比较一下两者的语法区别:
-
抽象类可以有构造方法,接口中不能有构造方法。
-
抽象类中可以有普通成员变量,接口中没有普通成员变量
-
抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
-
抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
-
抽象类中可以包含静态方法,接口中不能包含静态方法
-
抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。 特点 | 抽象类 | 接口 | | --------- | ------------------- | ---------------------------- | | 构造方法 | 有 | 无 | | 普通成员变量 | 有 | 无 | | 普通方法 | 可以有非抽象的 | 必须是抽象的 | | 抽象方法的访问类型 | public、protected和默认 | 只能是public的,默认public abstract | | 静态方法 | 可以有 | 无 | | 静态成员变量 | 有 | 有 public static final的 | | 其他类 | 只能继承一个抽象类 | 可以实现多个接口 | | 应用场景 | 模块之间通信契约 | 代码重用
JVM
1. 持久区jvm堆内存溢出
下面哪种情况会导致持久区jvm堆内存溢出?
循环上万次的字符串处理
在一段代码内申请上百M甚至上G的内存
使用CGLib技术直接操作字节码运行,生成大量的动态类
不断创建对象
答案
使用CGLib技术直接操作字节码运行,生成大量的动态类
解析 简单的来说 java的堆内存分为两块:permantspace(持久带) 和 heap space。
持久带中主要存放用于存放静态类型数据,如 Java Class, Method 等, 与垃圾收集器要收集的Java对象关系不大。
而heapspace分为年轻带和年老带
年轻代的垃圾回收叫 Young GC, 年老代的垃圾回收叫 Full GC。
在年轻代中经历了N次(可配置)垃圾回收后仍然存活的对象,就会被复制到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象
年老代溢出原因有 循环上万次的字符串处理、创建上千万个对象、在一段代码内申请上百M甚至上G的内存,既A B D选项
持久代溢出原因 动态加载了大量Java类而导致溢出
建议看看这篇博客入门通俗易懂 blog.csdn.net/sivyer123/a…
2. 关于OutOfMemoryError,正确的是
java.lang.OutOfMemoryError: PermGen space
增加-XX:MaxPermSize这个参数的值的话,这个问题通常会得到解决。
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
当你正准备创建一个超过虚拟机允许的大小的数组时,这条错误将会出现
java.lang.OutOfMemoryError: Java heap space
一般情况下解决这个问题最快的方法就是通过-Xmx参数来增加堆的大小
java.lang.OutOfMemoryError: nativeGetNewTLA
这个异常只有在jRockit虚拟机时才会碰到
正确答案: A B C D
解析 关于此题,《深入理解java虚拟机》有关于OOM(OutOfMemory)问题的解释
A:属于运行时常量池导致的溢出,设置-XX:MaxPermSize可以解决这个问题,查了一下为"永久代"内存大小不足,“永久代”的解释应该为JVM中的方法区,主要用于存储类信息,常量,静态变量,即时编译器编译后代码等。本错误仅限于Hotspot虚拟机,本区进行垃圾回收很少,不够直接加大简单粗暴。
B:属于堆空间不足导致的错误,问题比较少见,解决方式和C相同,直接翻译报错信息:数组过长导致堆内存溢出,加大堆内存或者减少数组长度。
C:属于java堆内存问题,一般的手段是通过内存映像分析工具,对Dump出来的堆转储存快照进行分析,重点是确认内存中的对象是否是有必要的,也就是要判断是出现了内存泄漏,还是出现了内存溢出,如果是内存列楼,通过工具检查泄露对象打GC Roots的引用链信息,可以准确的确定出泄露代码的位置,不存在泄露,就应该检查虚拟机的堆参数,如果可以继续调大,可以设置-Xmx解决问题,堆内存不足,直接增大堆内存。
D:java.lang.OutOfMemoryError: nativeGetNewTLA指当虚拟机不能分配新的线程本地空间(Thread Local Area)的时候错误信息,此错误是线程申请一个新的TLA时产生的,这个异常一般只会发生在jRockit虚拟机,只有过于绝对。