这两天阿里面试官问了我几个问题。
(1) 如果遇到了Full GC如何处理,
首先搞明白什么事Full GC ,JVM回收主要是堆的回收,而堆分为 新生代和老年代,新生代如果满了就会执行Minor GC,回收一次新生代的内存,
新生代执行垃圾回收很频繁,因此使用了复制法(Coping)
存活的对象会放在老年代,如果老年代满了,会执行Full GC,回收老年代的垃圾不是很频繁,因此使用了标记整理法(Mark-Compact)
由此看来:Full GC的生成条件:
(a)调用System.gc时,系统建议执行Full GC,但是不必然执行
(b)老年代空间不足
(c)方法区空间不足
(d)通过Minor GC后进入老年代的平均大小大于老年代的可用内存
(e)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
阿里大神面试官回答:
(a)看一下有没有大对象
(b)大的静态对象
(c) Dump 内存快照,进行分析
2、 concurrentHashMap 是否是线程安全的,如何实现的?
我做了总结:使用了分段锁的技术
这个问题比较复杂,可以参考:
hashmap,hashTable concurrentHashMap 是否为线程安全,区别,如何实现的
而且Java1.7与Java1.8实现方式并不相同,阿里的面试官3个都问道这个问题,他们好这口,
我整理了一下:ConcurrentHashMap原理分析(1.7与1.8)
3、MYSQL数据库隔离级别:
Mysql的隔离级别默认是 可重复读,REPEAT-READ
Oracle和SQL Server的默认隔离级别是:read-commit;
MySQL数据库为我们提供的四种隔离级别:
数据库事务的四大特性以及4种事务的隔离级别-以及对应的5种JDBC事务隔离级别
4、IO复用,什么是IO复用,以及应用
这个问题也比较复杂:
另一个面试官还问到IO与NIO的区别:
5、数据库遇到性能问题如何处理,
(1) 硬件提升:容量不足,磁盘不足,使用share memory
(2) 软件提升:性能不够,可以使用分库,分表,读写分离
(3)分布式部署:一个事务,两个数据库联动。使用分布式事务。