1. 前言
今年过的可真快,在家里醉生梦死
昨天开始发简历了,然后就是电话疯狂被call,也算是有一点压力了吧
明天就要面试第一家java公司了,还是挺紧张的,已经准备好被嫌弃的剔除公司门口了哈哈
先话2个小时来搞搞JVM吧
2. 面试题剖析
-
java内存结构
-
java heap 区分
看完之后其实对于零基础的我来说,是搞不清楚的,然后翻到《深入理解java虚拟机》,一看吓一跳,他这个就是人家书的目录。。。摘抄一下书中的重点吧:
-
java heap 分为 : 新生代和老年代,再细致一点有:Eden , From Survivor , To Survivor
-
无论哪个区域,存储的仍然是对象实例,进一步划分的目的是为了更好的回收内存,或者更快的分配内存
-
heap中没有内存完成分配实例,并且heap也无法再扩展时,会抛出 OutOfMemoryError 异常,此外抛出此异常的原因还要一个:Direct Memory被频繁使用。
Direct Memory 并不是JVM运行时数据区的一部分,受到本机总内存的限制
出现原因:NIO类引入基于Channel和Buffer的IO方式,可以使用本地函数直接分配堆外内存,避免java heap 和 本地堆中的来回复制数据
-
-
java对象的创建过程
上图是看《深入理解java虚拟机》2.3.1 记录的要点
检查 – 分配 — 设置必要信息 — 初始化 这四个步骤
在分配内存环环节,会根据垃圾回收器的算法不同而采用不同的方式
-
java对象的访问定位
上面讲java对象创建完成后,怎么来使用呢?
**
俩种方式的区别:
1
2
- 使用句柄访问:java stack中的reference存的是稳定的句柄地址,对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要修改
- 使用直接指针访问:速度快,节省了一次指针定位的时间开销
-
垃圾回收器是什么
Garbage Collection需要完成的事情:
- 那些内存需要回收
- 什么时候回收
- 如何回收
java heap 和 Method Area 中会用到GC