《2022年Java(1~5年经验)面试题100题.pdf》由会员分享,可在线阅读,更多相关《2022年Java(1~5年经验)面试题100题.pdf(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2022年Java(l5年经验)面试题100题(一)一、Java基础篇1、抽象类必须要有抽象方法吗?【仅供参考】不需要,抽象类不一定非要有抽象方法。示例代码:a b s t r a c t c la s s Ca t p u b lic s t a t ic v oid s a y H i()Sy s t em,ou t.p r int in(hi );上面代码,抽象类并没有抽象方法但完全可以正常运行。2、O b jec t 常用方法有哪些?【仅供参考】J a v a 面试经常会出现的一道题目,O b jec t 的常用方法。下面给大家整理一下。O b jec t 常用方法有:t oSt r
2、ing O、eq u a ls。、ha s hCod e()、c lone。等。3、J DK/J RE/J V M 三者的关系【仅供参考】J V M英文名称(J a v a V ir t u a l M a c hine),就是我们耳熟能详的J a v a 虚拟机。J a v a 能够跨平台运行的核心在于J V M o所有的ja v a 程序会首先被编译为.c la s s 的类文件,这种类文件可以在虚拟机上执行。也就是说c la s s 文件并不直接与机器的操作系统交互,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。针对不同的系统有不同的jv m实现,有 L inu x
3、 版 本 的 jv m实现,也有W ind ow s 版 本 的 jv m实现,但是同一段代码在编译后的字节码是一样的。这就是J a v a 能够跨平台,实现一次编写,多处运行的原因所在。J RE英文名称(J a v a Ru nt ime Env ir onment),就是J a v a 运行时环境。我们编写的J a v a 程序必须要在J RE才能运行。它主要包含两个部分,J V M 和 J a v a 核心类库。J RE是J a v a 的运行环境,并不是一个开发环境,所以没有包含任何开发工具,如编译器和调试器等。如果你只是想运行J a v a 程序,而不是开发J a v a 程序的话,
4、那么你只需要安装J RE即可。J DK第1/23页J DK 目录下有个J RE,也就是J DK 中已经集成了 J RE,不用单独安装J RE。另外,J DK 中还有一些好用的工具,如jinfo,jp s,js t a c k等。J RE=J V M +J a v a 核心类库J DK =J RE+J a v a 工 具+编 译 器+调试器4、阐述 fina l、fina lly、fina liz e 的区别。【仅供参考】其实是三个完全不相关的东西,只是长的有点像。fina l如上所示。fina lly:fina lly 是 对 J a v a 异常处理机制的最佳补充,通常配合t r y、c a
5、 t c h 使用,用于存放那些无论是否出现异常都一定会执行的代码。在实际使用中,通常用于释放锁、数据库连接等资源,把资源释放方法放到f i na lly 中,可以大大降低程序出错的几率。f i na li z e:Ob j e c t 中的方法,在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。f i na li z e。方法仅作为了解即可,在 J a v a 9中该方法已经被标记为废弃,并添加新的j a v a.la ng.r e f.C le a ne r,提供了更灵活和有效的方法来释放资源。这也侧面说明了,这个方法的设计是失败的,因此更加不能去使用它。5、J D K 1.8 之后
6、有哪些新特性?【仅供参考】接口默认方法:J a v a 8 允许我们给接口添加一个非抽象的方法实现,只需要使用d e f a u lt 关键字即可La mb d a 表达式和函数式接口:La mb d a 表达式本质上是一段匿名内部类,也可以是一段可以传递的代码。La mb d a 允许把函数作为一个方法的参数(函数作为参数传递到方法中),使用La mb d a 表达式使代码更加简洁,但是也不要滥用,否则会有可读性等问题,E f f e c t i v eJ a v a 作 者 J o s h B lo c h 建议使用La mb d a 表达式最好不要超过3 行。S t r e a m AP
7、I:用函数式编程方式在集合类上进行复杂操作的工具,配合La mb d a 表达式可以方便的对集合进行处理。J a v a 8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用S t r e a m A P I 对集合数据进行操作,就类似于使用S QL执行的数据库查询。也可以使用S t r e a m A P I 来并行执行操作。简而言之,S t r e a m A P I 提供了一种高效且易于使用的处理数据的方式。方法引用:方法引用提供了非常有用的语法,可以直接引用已有Ja v a 类或对象(实例)的方法或构造器。与l a m b
8、d a 联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。日期时间AP I:Ja v a 8 引入了新的日期时间AP I改进了日期时间的管理。Op t i o n a l 类:著名的Nu l l P o i n t e r Ex c e p t i o n 是引起系统失败最常见的原因。很久以前G o o g l e G u a v a 项目引入了 Op t i o n a l 作为解决空指针异常的一种方式,不赞成代码被n u l l 检查的代码污染,期望程序员写整洁的代码。受G o o g l e G u a v a 的鼓励,Op t i o n a l 现在是Ja v a 8库的一
9、部分。新工具:新的编译工具,如:Na s h o r n 引 擎 j j s、类依赖分析器j d e p s。6、讲讲什么是泛型?【仅供参考】T 。工开|曰T N/C r+i P I 的 入立匚灶,卜 4 士,/来 工 门 士 也 Lt 钻1 A W A U 来并I I 五期r 主 口 口第2/2 3 页ja v a忆生7E JD A。十71 HJ 丁捌付1 土,儿好伍止乂天他攸1TJTJ1I天1丈 天生经奴。尸叨TJ失型参数在使 时 具体的类型来替换。泛 型 最的 好 处 是 可 以 提 代 码 的 复 性。以Li s t 接口为例,我们可以将S t r i n g、In t e g e r
10、 等类 型 放 Li s t 中,如 不 泛 型,存放S t r i n g 类 型 要 写 个 Li s t 接口,存放In t e g e r 要写另外个Li s t 接口,泛型可以很好的解决这个问题。7、为什么要使用克隆?【仅供参考】克隆的对象可能包含一些已经修改过的属性,而 n e w 出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠克隆方法了。8、为什么不能用浮点型表示金额?【仅供参考】由于计算机中保存的小数其实是十进制的小数的近似值,并不是准确值,所以,千万不要在代码中使用浮点数来表示金额等重要的指标。建议使用B i g D e c i m
11、a l,或者Lo n g 来表示金额。9、说说类实例化的顺序【仅供参考】静态属性,静态代码块。普通属性,普通代码块。构造方法。1 0、B IO、N IO、A I 0 有什么区别?【仅供参考】B IO:B l o c k 1 0 同步阻塞式1 0,就是我们平常使用的传统1 0,它的特点是模式简单使用方便,并发处理能力低。N IO:N o n 1 0 同步非阻塞1 0,是 传 统 1 0 的升级,客户端和服务器端通过C h a n n e l (通道)通讯,实现了多路复用。A IO:A s y n c h r o n o u s 1 0 是 N I 0 的升级,也 叫 N I0 2,实现了异步非堵
12、塞1 0 ,异 步 1 0 的操作基于事件和回调机制。1 1、抽象类能使用f i n a l 修饰吗?【仅供参考】不能,定义抽象类就是让其他类继承的,如果定义为f i n a l 该类就不能被继承,这样彼此就会产生矛盾,所 以 f i n a l 不能修饰抽象类,编辑器也会提示错误信息:1 2、两个对象的h a s h C o d e 0 相同,则 e q u a l s()也一定 为 t r u e,对吗?【仅供参考】不对,两个对象的h a s h C o d e()相 同,e q u a l s()不一定 t r u e。代码示例:第3/2 3 页St r i n g s t r l =通
13、话;St r i n g s t r 2 =重地”;Sy s t e m,o u t.p r i n t i n (St r i n g,f o r m a t (/zs t r l :%d|s t r 2:%d”,s t r l.h a s h C o d e (),s t r 2.h a s h C o d e ();Sy s t e m,o u t.p r i n t i n(s t r l.e q u a l s(s t r 2);执行的结果:s t r l:1 1 7 9 3 9 5 s t r 2:1 1 7 9 3 9 5f a l s e代码解读:很显然“通话”和“重地”的h
14、a s h C o d e 0相同,然 而e q u a l s()则 为f a l s e,因为在散列表中,h a s h C o d e 0相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。1 3、面向对象和面向过程的区别?【仅供参考】面向对象和面向过程是一种软件开发思想。面向过程就是分析出解决问题所需要的步骤,然后用函数按这些步骤实现,使用的时候依次调用就可以了。面向对象是把构成问题事务分解成各个对象,分别设计这些对象,然后将他们组装成有完整功能的系统。面向过程只用函数实现,面向对象是用类实现各个功能模块。以五子棋为例,面向过程的设计思路就是首先分析问题的步骤:1、
15、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:黑白双方棋盘系统,负责绘制画面规则系统,负责判定诸如犯规、输赢等。黑白双方负责接受用户的输入,并告知棋盘系统棋子布局发生变化,棋盘系统接收到了棋子的变化的信息就负责在屏幕上面显示出这种变化,同时利用规则系统来对棋局进行判定。1 4、那为什么S t r i n g要设计成不可变的?【仅供参考】主要有以下几点原因:线程安全。同一个字符串实例可以被多个线程共享,因
16、为字符串不可变,本身就是线程安全的。支持h a s h映射和缓存。因为S t r i n g的h a s h值经常会使用到,比如作为M a p的键,不可变的特性使 得h a s h值也不会变,不需要重新计算。出于安全考虑。网络地址UR L、文件路径p a t h、密码通常情况下都是以S t r i n g类型保存,假若S t r i n g不是固定不变的,将会引起各种安全隐患。比如将密码用S t r i n g的类型保存,那么它将一直留在内存中,直到垃圾收集器把它清除。假如S t r i n g类不是固定不变的,那么这个密码可能会被改变,导致出现安全隐患。第4/2 3页字符串常量池优化。Str
17、ing对象创建之后,会缓存到字符串常量池中,下次需要创建同样的对象时,可以直接返回缓存的引用。15、重 载(Overload)和 重 写(Override)的区别?【仅供参考】方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载:一个类中有多个同名的方法,但是具有有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)。重写:发生在子类与父类之间,子类对父类的方法进行重写,参数都不能改变,返回值类型可以不相同,但是必须是父类返回值的派生类。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。16、J a v a中
18、操作字符串都有哪些类?它们之间有什么区别?【仅供参考】操作字符串的类有:String StringBuffer、StringBuilder。String和StringBuffer、StringBuilder的区别在于String声明的是不可变的对象,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer、StringBuilder可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用StringoStringBuffer和StringBuilder最大的区别在于,StringBuffer是线程安全的,而StringBuilde
19、r是非线程安全的,但StringBuilder的性能却高于StringBuffer,所以在单线程环境下推荐使用StringBuilder,多线程环境下推荐使用StringBuffer。17、final、finally、finalize 有什么区别?【仅供参考】final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。final
20、ize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,J a v a中允许使用finalize。方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。18、Error和Exception区别是什么?【仅供参考】Error类型的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等,编译器不会对这第5/23页类错误进行检测,J A V A 应用程序也不应对这类错误进行捕获,一旦这类错误发生,通常应用程序会被终止,仅靠应用程序本身无法恢复;E x c e p t i o n 类的错误是可以在应用程序中进行捕获并处理的,通常遇到这种错误,应对其进行处理,使应用程序
21、可以继续正常运行。19、t r y-c at c h-f in al l y 中,如果 c at c h 中 r e t u r n 了,f in al l y 还会执行吗?【仅供参考】f in al l y 一定会执行,即使是c at c h中 r e t u r n 了,c at c h中 的 r e t u r n 会 等 f in al l y 中的代码执行完之后,才会执行。2 0、运行时异常和一般异常(受检异常)区别是什么?【仅供参考】运行时异常包括R u n t im e E x c e p t ion 类及其子类,表 示 J VM在运行期间可能出现的异常。J av a 编译器不会
22、检查运行时异常。受检异常是E x c e p t ion 中 除 R u n t im e E x c e p t ion 及其子类之外的异常。J av a编译器会检查受检异常。R u n t im e E x c e p t ion 异常和受检异常之间的区别:是否强制要求调用者必须处理此异常,如果强制要求调用者必须进行处理,那么就使用受检异常,否则就选择非受检异常(R u n t im e E x c e p t ion)o 一般来讲,如果没有特殊的要求,我们建议使用R u n t im e E x c e p t ion 异常。二、Java进阶篇1、如何决定使用l l as hMap 还
23、是 T r e e Map?【仅供参考】对 于 在 M a p 中插入、删除、定位一个元素这类操作,H as hMap 是最好的选择,因为相对而言l l as hMap 的插入会更快,但如果你要对一个k e y 集合进行有序的遍历,那 T r e e Map 是更好的选择。2、怎么唤醒一个阻塞的线程【仅供参考】如果线程是因为调用了 w ait。、s l e e p。或 者 j oin()方法而导致的阻塞,可以中断线程,并且通过抛出I n t e r r u p t e d E x c e p t ion 来唤醒它;如果线程遇到了 1 0 阻塞,无能为力,因 为 10是操作系统实现的,J av
24、a代码并没有办法直接接触到操作系统。3、R e ad W r it e L oc k 是什么第6/2 3 页首先明确一下,不 是 说 R e e n t r an t L oc k 不好,只 是 R e e n t r an t L oc k 某些时候有局限。如果使用 R e e n t r an t L oc k,可能本身是为了防止线程A在写数据、线 程 B在读数据造成的数据不一致,但这样,如果线程C 在读数据、线 程 D也在读数据,读数据是不会改变数据的,没有必要加锁,但是还是加锁了,降低了程序的性能。因为这个,才诞生了读写锁R e a d W r i t e L o c k R e a
25、d W r i t e L o c k 是 一 个 读 写 锁 接 口 ,R e e n t r a n t R e a d W r i t e L o c k 是R e a d W r i t e L o c k接口的一个具体实现,实现了读写的分离,读锁是共享的,写锁是独占的,读和读之间不会互斥,读和写、写和读、写和写之间才会互斥,提升了读写的性能。4、什么是线程池?有哪几种创建方式?【仅供参考】线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处理完之后线程并不会被销毁,而是等待下一个任务。由于创建和销毁线程都是消耗系统资源的,所以当你想要频繁的创建和销毁线程的
26、时候就可以考虑使用线程池来提升系统的性能。j a va 提供了一个j a va.ut i l,c o n c ur r e n t.E xe c ut o r 接口的实现用于创建线程池。5、线程池的核心属性有哪些?【仅供参考】t h r e a d F a c t o r y(线程工厂):用于创建工作线程的工厂。c o r e P o o l S i ze (核心线程数):当线程池运行的线程少于c o r e P o o l S i ze 时,将创建一个新线程来处理请求,即使其他工作线程处于空闲状态。wo r k Q ue ue (队列):用于保留任务并移交给工作线程的阻塞队列。m a xi
27、m um P o o l S i ze (最大线程数):线程池允许开启的最大线程数。h a n d l e r (拒绝策略):往线程池添加任务时,将在下面两种情况触发拒绝策略:1)线程池运行状态不是R U N N I N G;2)线程池已经达到最大线程数,并且阻塞队列已满时。k e e p A l i ve T i m e (保持存活时间):如果线程池当前线程数超过c o r e P o o l S i ze,则多余的线程空闲时间超过k e e p A l i ve T i m e 时会被终止。6、什么是多线程的上下文切换【仅供参考】多线程的上下文切换是指C P U 控制权由一个已经正在运行的
28、线程切换到另外一个就绪并等待获取 C P U 执行权的线程的过程。7、s yn c h r o n i ze d、vo l a t i l e、C A S 比较【仅供参考】(1)s yn c h r o n i ze d 是悲观锁,属于抢占式,会引起其他线程阻塞。(2)vo l a t i l e 提供多线程共享变量可见性和禁止指令重排序优化。(3)C A S 是基于冲突检测的乐观锁(非阻塞)8、多线程同步有哪几种方法?L r 皿也毒著第7/2 3页S y n ch r o n i z e d关键字,L o ck 锁实现,分布式锁等。9、线 程 的 r u n()和 s t ar t ()有什
29、么区别?【仅供参考】s t ar t()方法用于启动线程,r u n()方法用于执行线程的运行时代码。r u n()可以重复调用,而 s t ar t ()只能调用一次。1 0、s y n ch r o n i z e d 和 v o l at i l e 的区别是什么?【仅供参考】v o l at i l e 是变量修饰符;s y n ch r o n i z e d是修饰类、方法、代码段。v o l at i l e 仅能实现变量的修改可见性,不能保证原子性;而 s y n ch r o n i z e d则可以保证变量的修改可见性和原子性。v o l at i l e 不会造成线程的阻塞
30、;s y n ch r o n i z e d可能会造成线程的阻塞。1 1、什么是 F u t u r e?【仅供参考】在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承t h r e ad类还是实现r u n n abl e 接口,都无法保证获取到之前的执行结果。通过实现C al l back接口,并 用 F u t u r e 可以来接收多线程的执行结果。F u t u r e 表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加C al l back 以便在任务执行成功或失败后作出相应的操作。1 2、如何停止一个正在运行的线程?【仅供参考】有几种方式。
31、1、使用线程的s t o p 方法。使用S t o p。方法可以强制终止线程。不过s t o p 是一个被废弃掉的方法,不推荐使用。使用S t o p 方法,会一直向上传播T h r e adD e at h 异常,从而使得目标线程解锁所有锁住的监视器,即释放掉所有的对象锁。使得之前被锁住的对象得不到同步的处理,因此可能会造成数据不一致的问题。2、使用i n t e r r u p t 方法中断线程,该方法只是告诉线程要终止,但最终何时终止取决于计算机。调用i n t e r r u p t 方法仅仅是在当前线程中打了一个停止的标记,并不是真的停止线程。接着调用T h r e ad.cu r
32、r e n t T h r e adO.i s l n t e r r u p t e d()方法,可以用来判断当前线程是否被终止,通过这个判断我们可以做一些业务逻辑处理,通常如果i s l n t e r r u p t e d返回t r u e 的话,会抛一个中断异常,然后通过t r y-cat ch 捕获。3、设置标志位设置标志位,当标识位为某个值时,使线程正常退出。设置标志位是用到了共享变量的方式,为了保证共享变量在内存中的可见性,可以使用vo l at i l e修饰它,这样的话,变量取值始终会从主存中获取最新值。但是这种vo l at i l e标记共享变量的方式,在线程发生阻塞时
33、是无法完成响应的。比如调用T h r ead,s l eep()方法之后,线程处于不可运行状态,即便是主线程修改了共享变量的值,该线第8/2 3 页程此时根本无法检查循环标志,所以也就无法实现线程中断。因此,i n t er r up t。加上手动抛异常的方式是目前中断一个正在运行的线程最为正确的方式了。1 3、实现可见性的方法有哪些?【仅供参考】s y n ch r o n i z ed或 者 L o ck:保证同一个时刻只有一个线程获取锁执行代码,锁释放之前把最新的值刷新到主内存,实现可见性。1 4、反射有哪些应用场景呢?【仅供参考】川BC 连接数据库时使用C l as s.fo r N
34、am e()通过反射加载数据库的驱动程序E cl i s p e、I D E A等开发工具利用反射动态解析对象的类型与结构,动态提示对象的属性和方法W eb服务器中利用反射调用了S evl et 的s er vi ce方法J D K 动态代理底层依赖反射实现1 5、反射的实现式都有什么?【仅供参考】获取C l as s 对象,有4 种 法:(l)C l as s.fo r N am e(“类的路径”);(2)类名.cl as s;(3)对象名.get C l as s O;(4)基本类型的包装类,可以调 包装类的T y p e属性来获得该包装类的C l as s 对象。1 6、什么是简单工厂模
35、式?【仅供参考】答:简单工厂模式又叫静态工厂方法模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。比如,一台咖啡机就可以理解为一个工厂模式,你只需要按下想喝的咖啡品类的按钮(摩卡或拿铁),它就会给你生产一杯相应的咖啡,你不需要管它内部的具体实现,只要告诉它你的需求即可。优 点:工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象;客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过
36、简单工厂模式可以减少使用者的记忆量;通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。缺 点:不易拓展,一旦添加新的产品类型,就不得不修改工厂的创建逻辑;产品类型较多时,工厂的创建逻辑可能过于复杂,一旦出错可能造成所有产品的创建失败,不利于系统的维护。第9/2 3 页1 7、J a v a 中什么叫单例设计模式?请 用 J a v a 写出线程安全的单例模式【仅供参考】单例模式重点在于在整个系统上共享一些创建时较耗资源的对象。整个应用中只维护一个特定类实例,它被所有组件共同使用。J a v a.l a n g.R u n t i m
37、e 是单例模式的经典例子。从 J a v a 5 开始你可以使用枚举(e n u m)来实现线程安全的单例。1 8、说 一 下 J V M 有哪些垃圾回收算法?【仅供参考】标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半。分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制
38、算法,老年代采用标记整理算法。1 9、说 一 下 J V M 调优的工具?【仅供参考】J D K 自带了很多监控工具,都位于J D K 的 b i n 目录下,其中最常用的是j c o n s o le 和j v i s u a lv m 这两款视图监控工具。j c o n s o le:用 于 对 J V M 中的内存、线程和类等进行监控;j v i s u a lv m:J D K 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、g c 变化等。2 0、常 用 的 J V M 调优的参数都有哪些?【仅供参考】-X m s 2 g:初始化推大小为2 g;-X m
39、x 2 g:堆最大内存为2 g;-X X:N e w R a t i o=4:设置年轻的和老年代的内存比例为1:4;-X X:S u rv i v o rR a t i o=8:设置新生代 E d e n 和 S u rv i v o r 比例为 8:2;-X X:+U s e P a rN e w G C:指定使用 P a rN e w +S e ri a l O ld 垃圾回收器组合;-X X:+U s e P a ra lle l0 1 d G C:指定使用 P a rN e w +P a rN e w O ld 垃圾回收器组合;-X X:+U s e C o n c M a rkS w
40、 e e pG C:指定使用 C M S +S e ri a l O ld 垃圾回收器组合;-X X:+P ri n t G C:开启打印g c 信息;-X X:+P ri n t G C D e t a i ls:打印 g c 详细信息。三、Java Web篇1、o s i 的七层模型都有哪些?第1 0/2 3 页【仅供参考】物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。数据链路层:负责建立和管理节点间的链路。网络层:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。传输层:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。会话层:向两个实体的表示层
41、提供建立和使用连接的方法。表示层:处理用户信息的表示问题,如编码、数据格式转换和加密解密等。应用层:直接向用户提供服务,完成用户希望在网络上完成的各种工作。2、解释一下什么是a op?【仅供参考】a o p 是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。简单来说就是统一处理某一“切面”(类)的问题的编程思想,比如统一处理日志、异常等。3、为什么要使用s p r i ng?【仅供参考】s p r i ng 提 供 i oc 技术,容器会帮你管理依赖的对象,从而不需要自己创建和管理依赖对象了,更轻松的实现了程序的解耦。s p r i ng 提供了事务支持,使得事务
42、操作变的更加方便。s p r i ng 提供了面向切片编程,这样可以更方便的处理某一类的问题。更方便的框架集成,s p r i ng 可以很方便的集成其他框架,比 如 M y B a t i s、h i b er na t e等。4、说 一 下 s p r i ng m v c 运行流程?【仅供参考】s p r i ng mv c 先将请求发送给 D i s p a t c h er S er v let oD i s p a t c h er S er v let 查询一个或多个 H a nd ler M a p p i ng,找到处理请求的 C ont r olleroD i s p a
43、t c h er S er v let 再把请求提交到对应的C ont r oller。C ont r oller 进行业务逻辑处理后,会返回一个M od elA nd V i ew。D i s p a t h c h er 查询一个或多个V i ew R es olv er 视图解析器,找 到 M od elA nd V i ew 对象指定的视图对象。视图对象负责渲染返回给客户端。5、S p r i ng B oot 实现热部署有哪几种方式?【仅供参考】主要有两种方式:1、S p r ing Lo a d e d2、S p r ing-b o o t-d e v t o o ls6、S p
44、r ing Bo o t 的核心注解是哪个?它主要由哪几个注解组成的?【仅供参考】第1 1/2 3 页启动类上面的注解是S p r ingBo o t Ap p lic a t io n,它 也 是 S p r ing Bo o t 的核心注解,主要组合包含了以下3个注解:S p r ingBo o t C o nfigu r a t io n:组合了 C o nfigu r a t io n 注解,实现配置文件的功能。E na b 1 e Au t o C o nfigu r a t io n:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:S p r ingBo
45、 o t Ap p lic a t io n(e x c lu d e =D a t a S o u r c e Au t o C o nfigu r a t io n.c la s s )。C o mp o ne nt S c a n:S p r ing组件扫描。7、S p r ingb o o t 有哪些优点?【仅供参考】-快速创建独立运行的s p r ing项目与主流框架集成-使用嵌入式的s e r v le t 容器,应用无需打包成w a r 包-s t a r t e r s 自动依赖与版本控制-大量的自动配置,简化开发,也可修改默认值-准生产环境的运行应用监控-与云计算的天然集成8
46、、S p r ing C lo u d 优点?【仅供参考】集大成者,S p r ing C lo u d 包含了微服务架构的方方面面。约定优于配置,基于注解,没有配置文件。轻量级组件,S p r ing C lo u d 整合的组件大多比较轻量级,且都是各自领域的佼佼者。开发简便,S p r ing C lo u d 对各个组件进行了大量的封装,从而简化了开发。开发灵活,S p r ing C lo u d 的组件都是解耦的,开发人员可以灵活按需选择组件。9、jp a 和 hib e r na t e 有什么区别?【仅供参考】jp a 全 称 J a v a P e r s is t e nc
47、 e AP I,是 J a v a 持久化接口规范,hib e r na t e 属 于 j p a 的具体实现。1 0、J P A 和 H ib e r na t e 有哪些区别?【仅供参考】简而言之J P A 是一个规范或者接口H ib e r na t e 是 J P A 的一个实现当我们使用J P A 的时候,我们使用ja v a x.p e r s is t e nc e 包中的注释和接口时,不需要使用hib e r na t e 的导入包。我们建议使用J P A注释,因为哦我们没有将其绑定到H ib e r na t e 作为实现。后 来(我 知 道-小于百分之一的几率),我们可以
48、使用另一种J P A 实现。11、如 何 在 Sp r i n g B o o t 中添加通用的J S 代码?第12/2 3 页【仅供参考】在源文件夹下,创建一个名为s t a t i c 的文件夹。然后,你可以把你的静态的内容放在这里面。例如,m y a p p.j s 的路径是 r e s o u r c e s s t a t i c j s m y a p p.j s12、s p r i n g c l o u d 断路器的作用是什么?【仅供参考】在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用
49、方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。13、Sp r i n g B o o t 支持哪些日志框架?推荐和默认的日志框架是哪个?【仅供参考】Sp r i n g B o o t 支持 J a v a Ut i l L o g g i n g,L o g 4 j 2,L o c k b a c k 作为日志框架,如果你使用St a r t e r s 启动器,Sp r i n g B o o t 将 使 用 L o g b a c k 作为默认日志框架.14、什么是 s p r i n g b o o t?【仅
50、供参考】s p r i n g b o o t 是 为 s p r i n g 服务的,是用来简化新s p r i n g 应用的初始搭建以及开发过程的。15、说一下M y B a t i s 的一级缓存和二级缓存?【仅供参考】一级缓存:基 于 P e r p e t u a l Ca c h e 的 l l a s h M a p 本地缓存,它的声明周期是和SQ L Se s s i o n 一致的,有 多 个 SQ L Se s s i o n 或者分布式的环境中数据库操作,可能会出现脏数据。当 Se s s i o nf l u s h 或 c l o s e 之后,该 Se s s i