2019面试总结之问答

2019,个人面试总结/问答部分

  • 内存泄漏
    • 内存溢出
    • error和exception有什么区别?
    • GC中如何判断对象是否需要被回收?
    • 哪些可以作为GC中root的对象?
    • 请讲讲你所知道的常用集合类以及主要方法?
    • 请问aop的应用场景有哪些?
    • 你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?
    • 请你说明concurrenthashmap有什么优势以及1.7和1.8区别?
    • 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

内存泄漏

我的理解:一句话来说,就是内存有一个对象,并且以后再也用不到他了,但因为某种原因,JVM虚拟机没能成功的回收这个对象,那这个对象占的这块内存就是内存泄漏了。

内存溢出

我的理解:还是一句话来说,程序申请内存时,没有足够的内存供申请者使用,此时就会报错OOM,即所谓的内存溢出,内存泄漏的堆积最终可以导致内存溢出(ps:给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用)。

error和exception有什么区别?

首先Exception和Error都是继承于Throwable 类,而在 Java 中Throwable 类是异常处理机制的基本组成类型,只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch)。

Exception和Error是JAVA对于异常处理的两种方式。

Error是java程序运行中不可预料的异常情况,这种异常发生以后,会直接导致JVM不可处理或者不可恢复的情况。所以这种异常不可能抓取到,比如OutOfMemoryError、NoClassDefFoundError等。

Exception是java程序运行中可预料的异常情况,咱们可以获取到这种异常,并且对这种异常进行业务外的处理。

Exception又分为检查性异常和非检查性异常。两个根本的区别在于,检查性异常 必须在编写代码时,使用try catch捕获(比如:IOException异常)。非检查性异常 在代码编写使,可以忽略捕获操作(比如:ArrayIndexOutOfBoundsException),这种异常是在代码编写或者使用过程中通过规范可以避免发生的。

GC中如何判断对象是否需要被回收?

gc用到垃圾回收机制算法,判断是否是垃圾,从而进行回收。

引用可达法法,程序运行从开始,每次引用对象,都将对引用的对象进行连接起来,到最后形成一张网,没有在这张网上的对象则被认为是垃圾对象。

还有引用计数法,对于对象的引用,每引用一次计数器加一,引用失败,计数器减一,当计数器一段时间为0,则可以被认为是垃圾。

哪些可以作为GC中root的对象?

1.被启动类加载的类和创建的对象
2.栈内存中引用的对象
3.方法区中静态和常量引用的对象
4.本地方法中JNI引用的对象

请讲讲你所知道的常用集合类以及主要方法?

主要有两种。一种Collection,另一种Map。其中Collection包括Set、List和Queue,Set(无序无重)又包括HashSet、LinkedHashSet及TreeSet,List(有序有重)又包括ArrayList、LinkedList及Vector;其中Map包括HashTable、LinkedHashMap、HashMap及TreeMap

请问aop的应用场景有哪些?

AOP(Aspect-OrientedProgramming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。
OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。
例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。
这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
所以AOP可以运用在日志、全局异常处理、权限控制、链路跟踪等各个方面

你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?

a. 连接点(Joinpoint):程序执行的某个特定位置(如:某个方法调用前、调用后,方法抛出异常后)。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就是连接点。Spring仅支持方法的连接点。

b. 切点(Pointcut):如果连接点相当于数据中的记录,那么切点相当于查询条件,一个切点可以匹配多个连接点。Spring AOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。

c. 增强(Advice):增强是织入到目标类连接点上的一段程序代码。Spring提供的增强接口都是带方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。很多资料上将增强译为“通知”,这明显是个词不达意的翻译,让很多程序员困惑了许久。 说明: Advice在国内的很多书面资料中都被翻译成”通知”,但是很显然这个翻译无法表达其本质,有少量的读物上将这个词翻译为”增强”,这个翻译是对Advice较为准确的诠释,我们通过AOP将横切关注功能加到原有的业务逻辑上,这就是对原有业务逻辑的一种增强,这种增强可以是前置增强、后置增强、返回后增强、抛异常时增强和包围型增强。

d. 引介(Introduction):引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过引介功能,可以动态的未该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。

e. 织入(Weaving):织入是将增强添加到目标类具体连接点上的过程,AOP有三种织入方式:①编译期织入:需要特殊的Java编译期(例如AspectJ的ajc);②装载期织入:要求使用特殊的类加载器,在装载类的时候对类进行增强;③运行时织入:在运行时为目标类生成代理实现增强。Spring采用了动态代理的方式实现了运行时织入,而AspectJ采用了编译期织入和装载期织入的方式。

f. 切面(Aspect):切面是由切点和增强(引介)组成的,它包括了对横切关注功能的定义,也包括了对连接点的定义。

请你说明concurrenthashmap有什么优势以及1.7和1.8区别?

concurrenthashmap是hashmap的多线程版本 jdk1.7中采用Segment + HashEntry的方式进行实现 1.8中放弃了Segment臃肿的设计,取而代之的是采用Node + CAS + Synchronized来保证并发安全进行实现

什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

一、什么是java虚拟机?
java虚拟机是执行字节码文件(.class)的虚拟机进程。
java源程序(.java)被编译器编译成字节码文件(.class)。然后字节码文件,将由java虚拟机,解释成机器码(不同平台的机器码不同)。利用机器码操作硬件和操作系统

二、为什么java被称为平台无关的编程语言?
因为不同的平台装有不同的JVM,它们能够将相同的.class文件,解释成不同平台所需要的机器码。正是因为有JVM的存在,java被称为平台无关的编程语言

你可能感兴趣的:(面试)