jvm知识点总结

JVM

一、内存模型

线程私有区

1、程序计数器

当同时进行的线程数超过CPU数或其内核数时,就要通过时间片轮询分派CPU的时间资源,不免发生线程切换。这时,每个线程就需要一个属于自己的计数器来记录下一条要运行的指令。如果执行的是JAVA方法,计数器记录正在执行的java字节码地址,如果执行的是native方法,则计数器为空。

2、虚拟机栈

线程私有的,与线程在同一时间创建。管理JAVA方法执行的内存模型。每个方法执行时都会创建一个桢栈来存储方法的的变量表、操作数栈、动态链接法、返回值、返回地址等信息。栈的大小决定了方法调用的可达深度(递归多少层次,或嵌套调用多少层其他方法,-Xss参数可以设置虚拟机栈大小)。栈的大小可以是固定的,或者是动态扩展的。如果请求的栈深度大于最大可用深度,则抛出stackOverflflowError;如果栈是可动态扩展的,但没有内存空间支持扩展,则抛出OutofMemoryError。 使用jclasslib工具可以查看class类文件的结构。下图为栈帧结构图:

3、本地法栈

与虚拟机栈作用相似。但它不是为Java方法服务的,而是本地方法(C言)。由于规范对这块没有强制要求,不同虚拟机实现方法不同。

线程共享区

1、方法区

线程共享的,用于存放被虚拟机加载的类的元数据信息,如常量、静态变量和即时编译器编译后的代码。若要分代,算是永久代(老年代),以前类大多“static”的,很少被卸载或收集,现回收废弃常量和无用的类。其中运行时常量池存放编译生成的各种常量。(如果hotspot虚拟机确定一个类的定义信息不会被使用,也会将其回收。回收的基本条件至少有:所有该类的实例被回收,而且装载该类的ClassLoader被回收)

2、堆

存放对象实例和数组,是垃圾回收的主要区域,分为新生代和老年代。刚创建的对象在新生代的Eden区中,经过GC后进入新生代的S0区中,再经过GC进入新生代的S1区中,15次GC后仍存在就进入老年代。这是按照一种回收机制进行划分的,不是固定的。若堆的空间不够实例分配,则OutOfMemoryError。

 

 

二、类加载与卸载

其中验证,准备,解析合称链接

加载通过类的完全限定名,查找此类字节码文件,利用字节码文件创建Class对象.

验证确保Class文件符合当前虚拟机的要求,不会危害到虚拟机自身安全.

准备进行内存分配,为static修饰的类变量分配内存,并设置初始值(0或null).不包含fifinal修饰的静态变量,因为fifinal变量在编译时分配.

解析将常量池中的符号引用替换为直接引用的过程.直接引用为直接指向目标的指针或者相对偏移量等.

初始化主要完成静态块执行以及静态变量的赋值.先初始化父类,再初始化当前类.只有对类主动使用时才会初始化.触发条件包括,创建类的实例时,访问类的静态方法或静态变量的时候,使用Class.forName反射类的时候,或者某个子类初始化的时候.

Java自带的加载器加载的类,在虚拟机的生命周期中是不会被卸载的,只有用户自定义的加载器加载的类才可以被卸

1、加载机制-双亲委派模式

双亲委派模式,即加载器加载类时先把请求委托给自己的父类加载器执行,直到顶层的启动类加载器.父类加载器能够完成加载则成功返回,不能则子类加载器才自己尝试加载。

优点:

  1. 避免类的重复加载。

  1. 避免Java的核心API被篡改。

2、分代回收

分代回收基于两个事实:大部分对象很快就不使用了,还有一部分不会立即无用,但也不会持续很长时间.

年轻代->标记-复制 ----- 老年代->标记-清除

3、回收算法

G1算法

1.9后默认的垃圾回收算法,特点保持高回收率的同时减少停顿.采用每次只清理一部分,而不是清理全部的增量式清理,以保证停顿时间不会过长其取消了年轻代与老年代的物理划分,但仍属于分代收集器,算法将堆分为若干个逻辑区域(region),一部分用作年轻代,一部分用作老年代,还有用来存储巨型对象的分区. 同CMS相同,会遍历所有对象,标记引用情况,清除对象后会对区域进行复制移动,以整合碎片空间.年轻代回收: 并行复制采用复制算法,并行收集,StopTheWorld.老年代回收: 会对年轻代一并回收初始标记完成堆root对象的标记,会StopTheWorld. 并发标记 GC线程和应用线程并发执行. 最终标记完成三色标记周期,会StopTheWorld. 复制/清楚会优先对可回收空间加大的区域进行回收。

三、堆和栈的区别

栈是运行时单位,代表着逻辑,内含基本数据类型和堆中对象引用,所在区域连续,没有碎片;堆是存储单位,代表着数据,可被多个栈共享(包括成员中基本数据类型、引用和引用对象),所在区域不连续,会有碎片。

1、功能不同

栈内存用来存储局部变量和方法调用,而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。

2、共享性不同

栈内存是线程私有的。 堆内存是所有线程共有的。

3、异常错误不同

如果栈内存或者堆内存不足都会抛出异常。 栈空间不足java.lang.StackOverFlowError。 堆空间不足:java.lang.OutOfMemoryError。

4、空间大小

栈的空间大小远远小于堆的

四、什么是Java虚拟机?为什么Java被称作是平台无关的编程语言?

Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

五、对象分配规则

  • 对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC。

  • 大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。

  • 长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次

  • Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,知道达到阀值对象进入老年区。

  • 动态判断对象的年龄。如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。

  • 空间分配担保。每次进行Minor GC时,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次Full GC,如果小于检查HandlePromotionFailure设置,如果true则只进行Monitor GC,如果false则进行Full GC。

六、如何判断对象可以被回收

判断对象是否存活一般有两种方式:

引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。

可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象

七、JVM的永久代中会发生垃圾回收么

垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(FullGC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下Java8:从永久代到元数据区 (注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区)

八、垃圾收集算法

GC最基础的算法有三种: 标记 -清除算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一般都采用分代收集算法。

  • 标记 -清除算法,“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清 除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。

  • 复制算法: “复制”(Copying)的收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

  • 标记-压缩算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

  • 分代收集算法,“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。

新生代内存不够用时候发生MGC(Minor gc)也叫YGC,JVM内存不够的时候发生FGC(full gc)

九、JVM性能调优参数

  • 设定堆内存大小

-Xmx:堆内存最大限制。

  • 设定新生代大小。 新生代不宜太小,否则会有大量对象涌入老年代

-XX:NewSize:新生代大小

-XX:NewRatio 新生代和老生代占比

-XX:SurvivorRatio:伊甸园空间和幸存者空间的占比

  • 设定垃圾回收器 年轻代用 -XX:+UseParNewGC 年老代用-XX:+UseConcMarkSweepGC

十、JVM 的主要组成部分及其作用

JVM包含两个子系统和两个组件,分别 

  • Class loader(类装载子系统)

  • Execution engine(执行引擎子系统);

  • Runtime data area(运行时数据区组件)

  • Native Interface(本地接口组件)。

  • Class loader(类装载): 根据给定的全限定名类名(如:java.lang.Object)来装载class文件到运行时数据区的方法区中。

  • Execution engine(执行引擎):执行class的指令。

  • Native Interface(本地接口): 与native lib交互,是其它编程语言交互的接口。

  • Runtime data area(运行时数据区域):即我们常说的JVM的内存。

十一、JVM 有哪些垃圾回收器

  • Serial收集器(复制算法): 新生代单线程收集器,标记和清理都是单线程,优点是简单高效;

  • ParNew收集器 (复制算法): 新生代收并行集器,实际上是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现;

  • Parallel Scavenge收集器 (复制算法): 新生代并行收集器,追求高吞吐量,高效利用 CPU。吞吐量 = 用户线程时间/(用户线程时间+GC线程时间),高吞吐量可以高效率的利用CPU时间,尽快完成程序的运算任务,适合后台应用等对交互相应要求不高的场景;

  • Serial Old收集器 (标记-整理算法): 老年代单线程收集器,Serial收集器的老年代版本;

  • Parallel Old收集器 (标记-整理算法): 老年代并行收集器,吞吐量优先,Parallel Scavenge收集器的老年代版本;CMS(Concurrent Mark Sweep)收集器(标记-清除算法): 老年代并行收集器,以获取最短回收停顿时间为目标的收集器,具有高并发、低停顿的特点,追求最短GC回收停顿时间。

  • G1(Garbage First)收集器 (标记-整理算法): Java堆并行收集器,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而前六种收集器回收的范围仅限于新生代或老年代。

  • ZGC (Z Garbage Collector)是一款由Oracle公司研发的,以低延迟为首要目标的一款垃圾收集器。它是基于动态Region内存布局,(暂时)不设年龄分代,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的收集器。在 JDK 11 新加入,还在实验阶段,主要特点是:回收TB级内存(最大4T),停顿时间不超过10ms。优点:低停顿,高吞吐量, ZGC 收集过程中额外耗费的内存小。缺点:浮动垃圾目前使用的非常少,真正普及还是需要写时间的。

新生代收集器:Serial、 ParNew 、 Parallel Scavenge

老年代收集器: CMS 、Serial Old、Parallel Old

整堆收集器: G1 , ZGC

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 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基础知识和集合框架是面试中最常考察的部分,主要考察应聘者的基础扎实度和掌握程度。多线程和JVMJava开发中的难点,需要求职者深入理解并掌握其原理,才能在面试中获得高分。网络编程和数据库相关问题则是针对应聘者的项目经验和实践经验,需要应聘者结合自己的经验和项目实践,进行深入的思考和总结。分布式系统和框架技术则是考察应聘者对当前技术潮流和趋势的了解程度,需要应聘者关注行业动态和进行充分的技术积累。 总的来说,《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、付费专栏及课程。

余额充值