1.面试时这么一个问题:当对象在内存分配时,大对象直接进入老年代,那么jvm怎么知道哪些是大对象呢
配置 -XX PretenueSizeThreshold参数 大于该参数的对象就会进入老年代
PretenureSizeThreshold参数只对Serial和ParNew两款收集器有效,所以同时需要配置垃圾收集器
配置垃圾收集器: -XX:+UseSerialGC
配置过程:在idea中的editConfiguration中配置vmOptions
添加 -XX PretenueSizeThreshold XXX
-XX:+UseSerialGC
2.数组和链表的应用场景
数组适合大小固定的、经常随机访问的,数据量小的
链表适合大小不固定的、经常删除和修改的
3.socket的bind和listen的区别
4.新生代转移到老年代地址会怎样
如果使用句柄访问的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体信息。
使用句柄来访问的最大好处就是 reference 中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而 reference 本身不需要修改。
Yong GC 类算法流程:
首先从 GC Roots 和 Old -> Young 的 Card Table(即存储了老年代对象与新生代对象之间的引用关系)出发,扫描追踪整个新生代的对象关系图。注意,在扫描过程中如果碰到指向老年代对象的引用,则停止这一路径的扫描。同时每扫描到一个对象,如果它是第一次被标记的话,我们就会将其拷贝到 survivor 区,或者晋升到老年代,并且在原对象位置的 mark word 域填上它的新地址 forwarding pointer。这样,如果原对象同时被两个以上的 reference 指向,那么在追踪过程中,别的 reference 还是有机会碰到此对象的原位置,然后发现它已经被标记过了,所以只需要通过 mark word 域的 forwarding pointer 更新 reference 值即可。
使用这类算法的有 Serial Young GC(即DefNew)、Parallel Young GC、ParNew,以及 G1 GC 的 Young GC & Mixed GC。
只需要一次遍历就可以完成对对象的拷贝和 reference 的更新。
Full GC 类算法流程:
有4个主要步骤:
1 标记:
- 直接从 GC Roots 出发,扫面一遍整个堆(有时可以加上 metaspace),找到所有活的对象。
2 计算新地址:
- 既然已知所有活的对象,那么就能够准确计算出它们在 compaction 后的新地址,然后将计算好的新地址保存到 mark word 域中。
3 更新 reference:
- 更新所有活对像中指向其他对象的 reference 的值,让它们指向步骤 2 中计算好的新地址(从 mark word中读取)。
4 复制对象到新地址:
- 将对象复制到步骤 2 计算的新地址。
使用这类算法的有 Serial Old GC、PS MarkSweep GC、Parallel Old GC、Full GC for CMS 和 Full GC for G1 GC。
参考:
内存地址会改变
5.软件的生命周期
瀑布模型:可行性分析、需求分析、软件设计、编码、软件测试、运行维护
特点:本阶段完成后才能进行下一阶段的工作。
V模型:可行性分析、需求分析、概要设计、详细设计、编码、单元测试、集成测试、系统测试、验收测试
-
预验收测试
可行性分析 -- ---> 验收测试
↘ 预系统测试 ↗
需求分析 -----> 系统测试
↘ 预集成测试 ↗
概要设计 ----> 集成测试
↘ 预单元测试 ↗
详细设计 -----> 单元测试
↘ ↗
编码
6.智力题 扔玻璃:
7.postman可以做什么:
8.数据库死锁:
9.各种排序算法的最好最坏的时间复杂度:
选择排序 最好和最坏都是O(n2)
快速排序 最好O(NlogN) 最坏O(n2)
归并排序 最好和最坏都是O(NlogN)
冒泡排序 最好O(N)最坏O(N2)
堆排 最好和最坏都是O(NlogN)