没有合适的资源?快使用搜索试试~ 我知道了~
首页北科Java面试宝典.pdf
北科Java面试宝典.pdf
需积分: 1 0 下载量 151 浏览量
更新于2023-11-24
收藏 3.19MB PDF 举报
《北科Java面试宝典》是一本以Java基础和JVM虚拟机为主题的面试指南。该文件包含了一系列面试题,共分为两个部分。 第一部分是Java基础面试题,共有24道题目。这些问题涵盖了Java平台的理解、String、StringBuffer、StringBuilder、int和Integer之间的区别、==和equals的区别、JDK1.8版本的新特性、final关键字的作用、内存泄漏和内存溢出的概念、抽象类和接口的区别、Error和Exception的区别、常见的Exception和解决方案、重写和重载的区别、反射的概念和好处、事务控制的层次、Cookie和session的区别和联系、线程调用start方法的情况、final、finally、finalize的区别、强引用、软引用、弱引用、幻象引用的区别、父子类静态代码块、非静态代码块、构造方法执行顺序、对象克隆的实现、Java序列化的概念和实现、深拷贝和浅拷贝的区别、JSP和Servlet的区别、JSP的四种作用域以及请求转发和重定向的区别。 第二部分是JVM虚拟机面试题,共有14道题目。主要涉及JDK1.7和1.8版本的JVM。 总结而言,该文件提供了丰富多样的Java基础面试题和JVM虚拟机面试题,是对于北科Java面试的一个很好的指导材料。
资源详情
资源推荐
内存溢出通俗的讲就是内存不够用了,并且 GC 通过垃圾回收也无法提供更多的内存。实际上除了程序
计数器,其他区域都有可能发生 OOM, 简单总结如下:
【1】堆内存不足是最常见的 OOM 原因之一,抛出错误信息
java.lang.OutOfMemoryError:Java heap space
原因也不尽相同,可能是内存泄漏,也有可能是堆的大小设置不合理。
【2】对于虚拟机栈和本地方法栈,导致 OOM 一般为对方法自身不断的递归调用,且 没有结束点,导
致不断的压栈操作。类似这种情况,JVM 实际会抛出 StackOverFlowError , 但是如果 JVM 试图去拓展栈
空间的时候,就会抛出 OOM.
【3】对于老版的 JDK, 因为永久代大小是有限的,并且 JVM 对老年代的内存回收非常不积极,所以当我
们添加新的对象,老年代发生 OOM 的情况也非常常见。
【4】随着元数据区的引入,方法区内存已经不再那么窘迫,所以相应的 OOM 有所改 观,出现 OOM,
异常信息则变成了:“java.lang.OutOfMemoryError: Metaspace”。
2. 请介绍类加载过程和双亲委派模型!
类加载过程 : 加载 -> 连接 -> 验证 -> 准备 -> 解析 -> 初始化
双亲委派模型: 先找父类加载器, 让父类加载器加载, 如果父类加载器无法加载就让子类加载器加载.这个
加载过程叫做双亲委派模型或者双亲委派机制.
3. 谈一谈堆和栈的区别!
栈: 存储局部变量, 基本类型数据, 动态链接(堆中对象的内存地址)
堆: 凡是new出来的对象都在堆中, 也就是存储数组和对象,垃圾回收器不定期到堆中收取垃圾.
4. 说一说jvm常见垃圾回收器和特点!
按照内存空间来划分,年轻代的垃圾回收器有:
Serial:是一个串行的垃圾回收器
ParNew:是Serial的并行版本
Parallel Scavenge:也是一个并行的垃圾回收器,区别在于它注重吞吐量
年轻代的三个垃圾回收器采用的垃圾回收算法都是复制算法,所以在进行垃圾回收时都会暂停所有的用
户线程;
然后是老年代的垃圾回收器:
Serial Old:是Serial的老年代版本,串行,采用的是标记-整理算法,同样会STW
Parallel Old:是Parallel Scavenge的老年代版本,并行,采用的是标记-整理算法,会STW,注重
吞吐量
CMS:注重低延迟,采用的是标记-清除算法,分为四个阶段:初始标记、并发标记、重新标记、
并发清除;在初始化和重新标记阶段中是并行的,会STW,其余两个阶段都是并发执行与用户线程
同时执行;由于采用标记清理算法,会产生空间碎片
最后是整堆收集器:G1收集器,G1收集器的特点有:能够独立管理整个堆空间、可利用多CPU、多核的
硬件优势缩短STW的时间、采用分代收集算法不会产生空间碎片
5. Java创建对象的过程!
对象的创建过程一般是从new指令开始的,JVM首先会对符号引用进行解析,解析完毕后JVM会为对象在
堆中分配内存,之后,JVM会将该内存进行零值初始化。最后,JVM会调用对象的构造函数。此时,一般
会有一个引用指向这个对象,将对象的地址值赋值给变量。在Java对象初始化过程中,主要涉及三种执
行对象初始化的结构,分别是 实例变量初始化、实例代码块初始化 以及 构造函数初始化。
6. Java中垃圾回收机制
垃圾回收机制用到finalize。当程序创建对象、数组等引用类型实体时,系统都会在堆内存中为之分
配一块内存区,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存就会
变成垃圾,等待垃圾回收机制进行回收。
分析对象是否为垃圾的方法 : 可达性分析法, 引用计数法两种
强制垃圾回收 : 当一个对象失去引用后,系统何时调用它的finalize ()方法对它进行资源清理,何时
它会变成不可达状态,系统何时回收它所占有的内存。对于系统程序完全透明。程序只能控制一个
对象任何不再被任何引用变量引用,绝不能控制它何时被回收。强制只是建议系统立即进行垃圾回
收,系统完全有可能并不立即进行垃圾回收,垃圾回收机制也不会对程序的建议置之不理:垃圾回收
机制会在收到通知后,尽快进行垃圾回收。
强制垃圾回收的两个方法 : 调用System类的gc()静态方法System.gc(), 调用Runtime对象的gc()实例
方法:Runtime.getRuntime().gc()方法
垃圾回收基本算法有四种 : 引用计数法, 标记清除法, 标记压缩法, 复制算法
垃圾回收复合算法 – 分代收集算法:
当前虚拟机的垃圾收集都采用分代收集算法,这种算法就是根据具体的情况选择具体的垃圾回收算
法。一般将java 堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集
算法。
比如在新生代中,每次收集都会有大量对象死去,所以可以选择复制算法,只需要付出少量对象的
复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对
它进行分配担保,所以我们必须选择“标记-清除”或“标记-压缩”算法进行垃圾收集。
7. Java中垃圾回收算法
(1)标记-清除算法:使用可达性分析算法标记内存中的垃圾对象,并直接清理,容易造成空间碎片
(2)标记-压缩算法:在标记-清除算法的基础上,将存活的对象整理在一起保证空间的连续性
(3)复制算法:将内存空间划分成等大的两块区域,from和to只用其中的一块区域,收集垃圾时将存
活的对象复制到另一块区域中,并清空使用的区域;解决了空间碎片的问题,但是空间的利用率低
(4)复合算法 - 分代收集算法:是对前三种算法的整合,将内存空间分为老年代和新生代,新生代中存
储一些生命周期短的对象,使用复制算法;而老年代中对象的生命周期长,则使用标记-清除或标记-整
理算法。
8. YoungGC和FullGC触发时机?
Young GC :Young GC其实一般就是在新生代的Eden区域满了之后就会触发,采用复制算法来回
收新生代的垃圾。
Full GC : 调用System.gc()时。系统建议执行Full GC,但是不必然执行
触发时机 :
老年代空间不足
方法区空间不足
进入老年代的平均大小大于老年代的可用内存
由Eden区,幸存者0区向幸存者1区复制时,对象大小大于1区可用内存,则把该对象转存到
老年代,且老年代的可用内存大小小于该对象大小。
注意:full GC是开发或调优中尽量要避免的,这样STW会短一些
9. FullGC触发可能产生什么问题
fullgc的时候除gc线程外的所有用户线程处于暂停状态,也就是不会有响应了。一般fullgc速度很快,毫秒级
的,用户无感知。除非内存特别大上百G的,或者fullgc也无法收集到足够内存导致一直fullgc,应用的外在表
现就是程序卡死了.
10. jvm调优工具和性能调优思路?
Jvm中调优使用的分析命令如下, 先试用下面命令分析jvm中的问题 :
Jps : 用于查询正在运行的JVM进程。 直接获取进程的pid
Jstat : 可以实时显示本地或远程JVM进程中装载,内存,垃圾信息,JIT编译等数据
Jinfo : 用于查询当前运行着的JVM属性和参数的值
Jmap : 用于显示当前java堆和永生代的详细信息
Jhat : 用于分析使用jmap生成的dump文件,是JDK自带的工具
Jstack: 用于生成当JVM所有线程快照,线程快照是虚拟机每一条线程正在执行的方法,目的是定位
线程出现长时间停顿的原因。
剩余62页未读,继续阅读
孤独斗士
- 粉丝: 1519
- 资源: 28
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C语言快速排序算法的实现与应用
- KityFormula 编辑器压缩包功能解析
- 离线搭建Kubernetes 1.17.0集群教程与资源包分享
- Java毕业设计教学平台完整教程与源码
- 综合数据集汇总:浏览记录与市场研究分析
- STM32智能家居控制系统:创新设计与无线通讯
- 深入浅出C++20标准:四大新特性解析
- Real-ESRGAN: 开源项目提升图像超分辨率技术
- 植物大战僵尸杂交版v2.0.88:新元素新挑战
- 掌握数据分析核心模型,预测未来不是梦
- Android平台蓝牙HC-06/08模块数据交互技巧
- Python源码分享:计算100至200之间的所有素数
- 免费视频修复利器:Digital Video Repair
- Chrome浏览器新版本Adblock Plus插件发布
- GifSplitter:Linux下GIF转BMP的核心工具
- Vue.js开发教程:全面学习资源指南
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功