JVM相关知识点总结

JVM相关知识点总结

1. JVM内存结构和管理机制

  1. 程序计数器:每个线程拥有一个PC寄存器,在线程创建时创建。指向下一条指令的地址。执行本地方法时,PC值为undefined。
  2. 方法区:保存装载类的信息;类型的常量池;字段,方法信息;方法字节码。
  3. 堆内存:new的对象都保存在Java堆中;所有的线程共享Java堆;对分代GC来说,堆也是分代的;GC管理的主要区域。
  4. 栈内存:线程私有,生命周期和线程相同;栈由一系列帧组成;帧保存一个方法的局部变量、操作数栈、常量池指针;每一个方法调用创建一个帧,并压入栈。
  5. 本地方法栈:保存native方法进入区域的地址。用于支持native方法的执行,存储每个native方法调用的状态。

2. JVM生命周期

JVM实例的诞生:

当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args) 函数的class都可以作为JVM实例运行的起点。

JVM实例的运行:

main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部都有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用。Java程序可以表明自己创建的线程为守护线程。

JVM实例的消亡:

当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以java.lang.Runtime类或者java.lang.System.exit()来退出。

3. JVM垃圾回收机制

首先判断GC在什么时候触发,其次判断对象是否存活,最后使用对应的垃圾回收算法回收垃圾。

GC在什么时候触发:

GC在优先级最低的线程中运行,一般在应用程序空闲时被调用。当内存不足时才会主动调用。

因为对象进行了分代处理,因此垃圾回收区域、时间也不一样。GC有如下两种:

  1. Young GC:一般情况下在年轻代尝试对象的分配,如果对象分配失败,就触发一次Young GC。
  2. Full GC:对整个内存进行整理,包括年轻代、老年代和永久代,所以Full GC比Young GC要慢, 因此应该尽量减少Full GC的次数。
判断对象是否存活:
  1. 引用计数法:堆中没创建一个对象,就都会为该对象创建一个计数器,默认初始值为1。当有其他变量被赋值为该对象的引用时,数值加1。当一个对象实例的引用死亡或被赋值新值时,计数器减1。
  2. 可达性分析算法:从GcRoot开始,寻找对应的引用节点,找到后继续寻找这个节点的引用结点,当所有引用节点寻找完毕后,剩余的节点就被认为是没有被引用的节点,即无用节点,无用节点被判定为可回收对象。

Java中可以作为GcRoot的包括下面几种:

  1. 虚拟机栈中引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中应用的对象
常用的垃圾回收算法:
  1. 标记-清除法:从GcRoot开始搜描,对存活的对象进行标记。标记完后,再扫描整个空间中未被标记的对象,进行垃圾回收。该方法容易造成内存碎片。
  2. 标记-整理算法:该算法与标记-清除算法一样,但是在完成标记后,不直接清理可回收对象,而是将存活对象全部向一端移动,接着清理掉边界以外的内存。
  3. 标记-复制算法:它将内存划分为大小相等的两块,每次只使用其中的一块。当这A快内存用完了,就将还存活的对象复制到B块上面,然后把A块的内存空间一次性清理掉。这种算法虽然实现简单,运行高效且不易产生内存碎片,但是却对内存空间的使用做出了高昂的代价,因为能使用的空间缩减为原来的一半。很显然,复制算法的效率跟存活对象的数量有很大关联,若存活对象很多,那么效率将大大降低。
  4. 分代收集算法:分代收集算法是目前大部分JVM的垃圾收集器采用的算法。其核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。将其分为年轻代、老年代和永久代。然后根据不同的区域采用合适的收集算法。

4. 常见的垃圾收集器

CMS收集器(标记-清除算法)

CMS收集过程:

  1. 初始标记(CMS-initial-mark) ,会导致stw;
  2. 并发标记(CMS-concurrent-mark),与用户线程同时运行;
  3. 预清理(CMS-concurrent-preclean),与用户线程同时运行;
  4. 可被终止的预清理(CMS-concurrent-abortable-preclean) 与用户线程同时运行;
  5. 重新标记(CMS-remark) ,会导致swt;
  6. 并发清除(CMS-concurrent-sweep),与用户线程同时运行;
  7. 并发重置状态等待下次CMS的触发(CMS-concurrent-reset),与用户线程同时运行;
G1收集器

G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.。在Oracle JDK 7 update 4 及以上版本中得到完全支持, 专为以下应用程序设计:

  1. 可以像CMS收集器一样,GC操作与应用的线程一起并发执行。
  2. 紧凑的空闲内存区间且没有很长的GC停顿时间。
  3. 需要可预测的GC暂停耗时。
  4. 不想牺牲太多吞吐量性能。
  5. 启动后不需要请求更大的Java堆。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java核心面试知识整理(架构师)是一份非常有价值的Java面试指南,此指南对于那些准备进行Java工作面试的候选者来说非常重要。该指南详细介绍了Java技术的基本概念,包括多线程、面向对象编程、JVM以及其他与Java语言相关的技术。除此之外,该指南还列出了一系列与Java技术相关的最新面试题目,并通过详细的解题思路和示例代码展示了如何解决这些问题。这对于那些想要通过Java面试的候选者来说非常有帮助。 此外,该指南还介绍了Java SE、Java EE、Spring、Hibernate等重要的框架和技术的概要以及相应的面试题目。候选人可以通过这些问题详细了解这些技术的实际应用,并为面试做好充分的准备。 总之,Java核心面试知识整理(架构师)是一份非常有用的指南,对于那些想在Java领域取得成功并通过技术面试的人来说非常有帮助。无论现在你是一个初学Java的新手,还是一位有经验的开发者或工程师,这份指南都值得一读。 ### 回答2: 《Java核心面试知识整理(架构师)》是一份重要的面试资料,涵盖了Java开发中的核心知识点和面试考察的难点,可以帮助应聘者更好地准备面试。 该资料主要分为八个章节,分别是Java基础知识、集合框架、多线程、JVM、网络编程、数据库、分布式系统和框架技术。在每个章节中,都涵盖了该领域中的重要概念、常见的面试题和优秀的回答方法,可以帮助应聘者在面试中更加从容自信地回答问题。 其中,Java基础知识和集合框架是面试中最常考察的部分,主要考察应聘者的基础扎实度和掌握程度。多线程和JVM是Java开发中的难点,需要求职者深入理解并掌握其原理,才能在面试中获得高分。网络编程和数据库相关问题则是针对应聘者的项目经验和实践经验,需要应聘者结合自己的经验和项目实践,进行深入的思考和总结。分布式系统和框架技术则是考察应聘者对当前技术潮流和趋势的了解程度,需要应聘者关注行业动态和进行充分的技术积累。 总的来说,《Java核心面试知识整理(架构师)》是一份全面、权威且实用的Java面试资料,对于想要深入了解Java开发技术和成功求职的人来说,具有非常重要的参考价值。 ### 回答3: 这份《Java核心面试知识整理(架构师版)》的文档总结了Java领域中架构师的核心面试知识。文档涵盖了Java基础、集合、多线程、JVM、设计模式、分布式微服务等方面的知识点。 在Java基础方面,文档详细介绍了Java语言的基础类型、运算符、循环结构、流程控制语句以及面向对象的特性和原则。而在集合方面,文档涵盖了Java中的各种集合类型及其特点,如List、Map、Set等。此外,文档还详细讲解了多线程的基本概念和Java中的线程安全问题,包括锁机制、线程池等。 在JVM方面,文档深入讲解了Java程序的运行原理和内存管理机制,详细分析了垃圾回收算法和优化策略,并解释了如何进行JVM性能调优。 文档还涉及了常用的设计模式及其应用场景,如单例模式、工厂模式、观察者模式等。此外,分布式、微服务等一系列架构方面的知识也被全方位地介绍和讲解。 总之,这份文档是Java架构师在面试时必备的知识点整理手册,对于正在准备面试的Java架构师和Java程序员来说具有非常重要的参考价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值