Offer来了 Java面试核心知识点精讲(原理篇)
- 1. Java程序具体运行过程
- 2. JVM的内存区域
- 3. JVM 运行时内存
- 4. GC 算法
- 5. 多线程
- 6. Java线程池的工作流程
- 7. 线程的生命周期
ISBN:978-7-121-37618-4
作者:王磊
页数:330页
阅读时间:2022-01-26
推荐指数:★★★★★

1. Java程序具体运行过程
- Java源文件被编译器编译成字节码文件。
- JVM将字节码文件编译成相应操作系统的机器码。
- 机器码调用相应操作系统的本地方法库执行相应的方法。
JVM包含如下:
- 一套字节码指令集
- 一个虚拟堆
- 一组程序寄存器
- 一个方法区
- 一个虚拟机栈
- 一个垃圾回收器
① 类加载器子系统将编译好的字节码(.class)文件加载到JVM
② 运行时数据区用于存储在JVM运行中产生的数据
③ 即时编译器用于将Java字节码编译成具体机器码
④ 本地接口用于调用操作系统的本地方法库完成具体的指令操作
JVM的具体架构图如下图所示:
2. JVM的内存区域

程序计数器:线程私有、无内存溢出,很小,存储当前线程执行的字节码行号指示器。
虚拟机栈:线程私有,描述Java方法的执行过程,在当前栈帧存储了局部变量表、操作数栈、处理动态连接、方法出口。
本地方法区:线程私有,Native方法服务。
堆:线程共享,创建对象产生的数据存储。
方法区:线程共享、永久代、存储常量、静态变量、类信息、即时编译器编译后的机器码、运行时常量池。内存回收主要针对常量池的回收和类的卸载,因此可回收的对象很少。
3. JVM 运行时内存
JVM运行时内存也叫作JVM堆,分为:新生代(占三分之一)、老生代(占三分之二)、永久代。
新生代又分为:Eden区(占十分之八)、SurvivorFrom区(占十分之一)、SurvivorTo区(占十分之一)。
新生代主要存储java基础讲多线程吗生命周期比较短、频繁创建的对象,因此会频繁的触发MinorGC。
Eden区:创建新对象时使用,内存不足会触发MinorGC
SurvivorFrom区:保留上一次MinorGC的幸存者
SurvivorTo区:上一次MinorGC时的幸存者作为这一次MinorGC的被扫描者。
老生代主要存储大对象,生命周期长的。因此采用MajorGC算法,不会频繁触发。
:
- 把Eden区和SurvivorFrom区中存活的对象复制到SurvivorTo区。根据年龄来判断(默认15岁),每次GC年+1。
- 清空Eden区和SurvivorFrom区中个对象。
- 将SurvivorTo区和SurvivorFrom区互换,原来的SurvivorTo区成为下一次GC时的SurvivorFrom区。
这种算法不会产生碎片,但是会导致空间缩小到原来的二分之一。
:
在进行MajorGC前会进行一次MinorGC,当老年代空间不足或无法找到足够的连续内存空间分配给新创建的大对象时,会触发MajorGC,容易产生内存碎片,会出现OutOfMemory。
永久代:主要存储Class、Meta(元数据)信息。GC不会在运行程序期间对永久代的内存进行清理,导致了永久代内存会随加载的Class文件增加而增加,会在加载过多时会OOM异常。
Java8 中永久代已经被元数据(元空间)取代。
元数据区并没有使用虚拟机内存,而是使用了OS本地内存,因此元空间大小不收JVM内存限制。

4. GC 算法
在垃圾回收之前需要确定哪些对象是垃圾,这里有两种方式:
引用计数法:
在Java操作对象时必须先获取对象的引用,所有添加一个引用时引用计数加1,删除时减1。当引用计数为0时就可以被回收。但是会出现循环引用问题,就是两个对象互相引用。
垃圾收集算法分为:标记清除算法、复制算法、标记整理算法、分代收集算法。
标记清除算法和复制算法可以看上面的描述。
标记整理算法:就是整合了标记清理的算法和复制算法,在标记阶段和标记清除算法的标记阶段一样,然后在标记完成之后将存活的对象移动到内存的另一端,并清理该端的对象。

5. 多线程
JVM线程与OS中的线程是相互对应的分为:
- 虚拟机线程:当JVM到达安全点时出现。
- 周期性任务线程:定时器调度线程来实现周期性任务。
- GC线程:不同垃圾回收活动。
- 编译器线程:在运行时将字节码动态编译成本地平台机器码是JVM跨平台具体实现。
- 信号分发线程:接收发送到JVM的信号并调用了JVM方法。
Java线程创建方式:
- 继承Thread类
- 实现Runnable接口
- 通过ExecutorService和Callable实现有返回值的线程
- 基于线程池
6. Java线程池的工作流程
Java线程池的7个核心参数:

拒绝策略:
br>
img src='https://s2.51cto.com/images/blog//_62b277cb7470e12742.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='Offer来了 Java面试核心知识点精讲(原理篇)_经验分享_09' title="Java线程池的工作流程" style="width: 1280px; visibility: visible; height: 1706px;">
img src='https://s2.51cto.com/images/blog//_62b277cb.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='Offer来了 Java面试核心知识点精讲(原理篇)_offer_10' title="线程的生命周期" style="width: 1706px; visibility: visible; height: 1280px;">
img src='https://s2.51cto.com/images/blog//_62b277cbad5f090791.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='Offer来了 Java面试核心知识点精讲(原理篇)_offer_11' title="线程的生命周期" style="width: 1280px; visibility: visible; height: 1706px;">
里面还有很多精华的内容,等你来发现哟~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/28.html