天天看点

【牛客网面经整理】0805百度面经

大家在整理面经时建议将相关问题全部整理;

1、Spring AOP,JDK代理和CGlib代理的区别,除了针对接口和类以外的不同?

答:

Spring AOP是运行时织入的,那么运行时织入是怎么实现的呢?

通过代理对象实现。

代理:静态代理,动态代理;

静态代理:由程序员创建或特定工具自动生成源码,再对其编译,在程序运行前,代理类的.class就已经存在了。

动态代理:在程序运行时,通过反射机制创建

静态代理的局限性:静态代理的每一个代理类只能为一个接口服务,这样一来程序开发中必然会产生过多的代理,会产生过多的重复代码。

解决办法:通过一个代理类完成全部的代理功能(动态代理)

动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java反射机制可以生成任意类型的动态代理类。java.lang.reflect包中Proxy类和InvocationHandler接口提供了生成动态代理类的能力。

Spring AOP使用动态代理技术在运行期织入增强的代码,主要有两种代理机制:JDK动态代理;CGLib动态代理

JDK动态代理(基于接口的代理):

涉及的类:java.lang.reflect包下的两个类:Proxy类和InvocationHandler接口

实现要点:1:通过java.lang.reflect.Proxy类来动态生成代理类

2、代理类要实现InvocationHandler接口,具体操作由invoke()方法

public Object invoke(Object proxy,Method method,Object[] args)throws Throwable;

Object proxy:指被代理的对象

Method method:要调用的方法

Object[]args:方法调用时所需要的参数

3、JDK代理只能基于接口进行动态代理

CGLib代理模式(基于继承的代理):

CGlib采用非常底层的字节码技术,基于ASM的字节码生成库,可以为一个类创建子类,并在子类中采用方法拦截的技术拦截所有的父类方法的调用,并顺势织入横切逻辑,也是通过方法去反射调用目标对象的方法

1、配置

2、代理实现MethodInterceptor方法

总结:

JDK优点:1、不依赖第三方jar包,使用方便

2、随着jdk升级,性能稳定提升

3、只能代理实现接口的类

4、如果程序需要频繁、反复地创建代理对象,则JDK动态代理在性能上更占优

CGLib优点:1、由于是动态生成字节码实现代理,因此代理对象的执行速度较快.

2、可以代理没有实现接口的对象

3、不能代理final类

4、执行快生成速度慢

5、不需要频繁创建代理对象的应用,如Spring中默认的单例bean,只需要在容器启动时生成一次代理对象

怎么设计实现一个事务?

作者:咚咚锵233

链接:https://www.nowcoder.com/discuss/497119

来源:牛客网

事务的ACID

答:参考https://editor.csdn.net/md/?articleId=108298117

隔离级别应用于什么场景解决什么问题

答:

假如现在读写有10%的概率冲突,用什么隔离级别

答:

JVM内存区域

答:

共享空间和私有空间可能会存在的问题

答:

堆里边会存储什么内容

答:https://blog.csdn.net/ghost_Programmer/article/details/40891735?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight

对象的实体

java中数据的5种存储位置?

  • 寄存器(最快):位于处理器内部,自动分配,无法人为控制
  • 栈(第二快):位于内存区域,通过栈指针来操作,向下移动,分配内存;向上移动,释放内存。常用于存放对象引用和基本数据类型,而不用于存储对象实体。
  • 堆:位于内存区域。存放的数据由jvm自动管理。好处:编译器不需要知道存储的数据在堆里存活多长时间。当new 的时候,会自动分配,所以要花费更多时间。
  • 常量池:常量(字符串常量和基本类型常量)通常直接存储在程序代码内部(常量池)。保存在编译器就已经确定的,已编译的class文件的一分数据。包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s=“java”
  • 非内存存储区:如果数据完全存活于程序之外,可以不受程序任何控制:流对象和持久化对象

堆栈内存两种存储方式的异同之处?

  • 相同点:堆和栈都用于程序中的数据
  • 不同点:1、存储数据类型:栈内存中存放局部变量(基本数据类型和对象引用),而堆内存中存放对象(实体)。

    2、存储速度:栈内存的存储分配与清理速度更快于堆,并且栈内存的存储速度仅次于直接位于处理器当中的存储器。

    3、灵活性:堆内存灵活性优于栈

栈内存和堆内存的存储数据类型为何不同?

答:对象类型数据在程序编译期,并不会在内存中进行创建和存储,而在运行期,才根据需要就行动态创建和存储,所以对象由堆内存进行存储管理;

局部变量的大小和生命周期都可以被确认,符合栈内存的存储特点。

垃圾回收方法,垃圾回收器

答: GC垃圾回收机制: 1、将内存中不再被使用的对象进行回收; 2、按照新生代旧生代的方式来对对象进行回收; 3、主要回收区域:堆,方法区;

4、对象被标记为垃圾的方法:可达性分析法;引用计数法

5、垃圾回收算法:(1)标记清除算法(2)复制算法(3)标记整理算法(4)分代回收算法 6、Full

GC的条件:jvm会首先检查老年代的连续空间是否大于新生代对象总大小或历次晋升的平均大小,如果条件成立首先进行minor gc,否则full GC;

垃圾回收器:

  • 新生代收集器:Serial、ParNew、Parallel Scavenge
  • 老年代收集器:CMS、Serial Old、Parallel Old
  • 整堆收集器: G1

哪些参数会影响到垃圾回收时间

答:-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间

什么时候会发生fullGC

答:堆内存划分为Eden、Survivor和Tenured/old空间

1、System.gc()方法的调用

2、老年代空间不足;

3、永生区空间不足;

4、CMS GC 时出现promotion failed和concurrent mode failure(采用CMS进行老年代GC)

5、HandlePromotionFailure(在发生mioner GC时,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果成立,则minor gc否则full gc)

6、堆中分配很大内存

快速判断一个数是不是2的幂次

答:判断整数对应的二进制串中只包含一个1;

n&(n-1)==0;

树的最大高度

答:递归,左右孩子的最大高度