Jvm主要面试问题整理

答案写的比较随意,只总结了要点。基本答案都来自于深入理解java虚拟机。

1 . 内存划分为几个区,每个区的作用

方法区:也称为永久代。在该区很少发生gc,一般gc是针对常量池和对类型的卸载。主要用于存储已经被jvm加载的类信息,常量,静态变量,代码等。线程共享。

虚拟机栈:为方法服务,每个方法在执行时会创建一个栈帧,用于存储局部变量表,方法出口等。线程私有。

本地方法栈:与虚拟机栈类似,只不过本地方法栈为native方法服务。

堆:存储对象的实例。线程共享。

程序计数器:pc,存储下一条所需要执行的字节码的地址。

2 . 如何判断一个对象是否存活

判断对象是否存活有两种方法,一种是引用计数法,给每个对象设置一个引用计数器,每当有一个地方引用这个对象时就+1,引用计算器为0时则进行回收,其缺陷是无法解决循环引用问题。Jvm采用的是可达性分析,从gc Roots开始向下搜索,如果一个对象到Gc Roots没有引用则说明该对象不可达。Gc Roots可以是虚拟机栈中引用的对象,方法区静态变量引用的对象,方法区中常量池引用的对象,本地方法栈引用的对象。当一个对象不可达时,会被标记,然后查看是否重写并且未执行finalize方法,如果是则放入队列中等待执行finalize方法,执行之后会再进行标记。若未重写或已执行,则回收该对象。

3. 简述java垃圾回收机制

在程序运行过程中,会不断产生一些无用对象。垃圾回收机制需要对内存进行回收,一般针对的是堆及方法区。首先需要判断对象是否存活,在列举gc Roots这步,无论哪种垃圾回收算法都需要stop the world。垃圾收集算法大致有三种,标记-清除,复制(新生代),标记-整理算法,现在垃圾回收都是分代的,在jvm中堆分为老年代和新生代,在不同代可能会采用不同的算法进行回收。方法区一般参考老年区。Java中实现了的垃圾回收器有Serial,Serial old,parallel parallel old,parnew,cms等。

4. Java中垃圾收集的方法有哪几种

标记-清除:标记要回收的对象,然后进行统一回收。效率不高,会产生大量不连续的内存碎片。老年代可选

复制算法:将内存划分为相等的两部分,每次只使用其中的一块。当一块内存用完时将还存活的对象复制到第二块内存上。在java的年轻代,划分了8:1:1的区域执行这种算法

标记-整理:在标记清除的基础上,在清除对象的时候将可回收对象移动到一端,然后清除掉边界以外的对象。不会产生内存碎片。老年代可选

5. Java类加载过程

加载:通过一个类的全限定名获取该类的二进制流,将二进制流中的静态存储结构转化为运行时数据结构,生成该类的Class对象。

验证:为了确保Class文件的信息不会危害到计算机而进行了文件格式验证,元数据验证,字节码验证,符号引用验证等。

准备:为类的静态变量分配内存初始化为默认值

解析:完成符号引用到直接引用的转换

初始化:执行类中的java代码(静态代码块和静态变量初始化)

6. 类加载器双亲委派模型机制

当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,父类若不能加载,反馈给子类,由子类完成类的加载。以保证所有相同的类在各种类加载器的环境中都是同一个类,行为保持一致。例如如果自己写了一个Object类,在加载过程中加载请求会最终提交到Bootstrap classloader,其会默认加载位于lib下的rt.jar包,找到java原装的Object类进行加载。

7. 什么是类加载器,类加载器有几种

负责将可能是网络上也可能是磁盘上的class文件加载到内存并生成Class对象。一旦一个类被加载进了jvm,同一个类就不会再次被加载,java识别是包名加类名。在jvm中是使用全限定类名和加载器作为标识,若加载器不同则生成的class文件也认为不同。

启动类加载器BootstrapClassLoader:jvm内核,主要负责lib下的类库,无法直接被程序使用。

扩展类加载器ExtensionClassLoader:启动类加载器的子类,主要加载lib/ext的类库

系统类加载器SystemClassLoader:classpath下的jar包和class文件,扩展类加载器的子类

User-Defined class loader:继承于系统类加载器

8. Java内存分配和回收策略以及Minor GC和Major GC

Jvm采用分代内存回收,主要回收堆和持久代。堆内分为年轻代和老年代,年轻代再划分为eden与survivor,比例为8:1:1,针对年轻代垃圾回收的机制称为minor gc,针对老年代和持久代垃圾回收的称为major gc。

对象优先分配到Eden区域,如果内存不够则触发minor gc,若对象为大对象(很长的字符串以及数组)会直接进入老年代。

Minor gc 触发:eden区域内存不足,将存活的对象复制到空的survivor中,并且年龄+1,年龄达到一定阈值会被移动到老年代。如果survivor空间中相同年龄所有对象大小的总和大于survivor一半,年龄大于这个值就可以进入老年区。发生minor gc之前,如果新生代所有空间大于了老年代的剩余空间,如果允许担保失败,会检查剩余空间是否大于历次平均晋升大小,如果大于会进行尝试,如果不允许冒险就会进行一次major gc(空间分配担保)。Java1.6后有更新。

Major gc在老年代内存不足,持久代内存不足,以及统计得到minor gc晋升到老年代的平均大小大于旧时代的剩余空间时触发。至少伴随一次Minor Gc。

9. 类的实例化顺序

父类的static代码块及static变量(依赖书写顺序),当前类的static代码块及static变量(依赖书写顺序),父类普通代码块及变量,父类的构造函数,子类普通代码及变量,子类构造函数。

10. 垃圾收集器,各自的优缺点

垃圾回收器是内存回收的具体实现。分别也是有工作在年轻代和老年代的分别。

         Serial:单线程收集器,只会使用一个线程完成垃圾收集工作。在进行垃圾收集时必须暂停其余线程。

         Parnew:Serial收集器的多线程版本,使用多条线程进行垃圾回收工作。

         Parallel Scavenge:吞吐量优先,主要适合在后台运算而不需要太多交互的任务。配合有自适应策略。

         Serial old:serial收集器的老年代版本

         Parallel old:parallel 收集器的老年代版本

         CMS收集器:最短回收停顿;

         初始标记(标记gc root直接关联的对象)(暂停),并发标记(gc root遍历),重新标记(修正在标记期间因程序运行而带来的变动)(暂停),并发清除。

          缺点:对CPU资源敏感,无法处理浮动垃圾(一部分垃圾出现在标记过程之后,无法在当次进行处理。由于在收集时还要预留给程序部分空间,cms不能等待到老年代几乎满了之后再进行收集,一般在使用了92%就会进行,如果预留的内存无法满足需求,则会导致Concurrent Model Failure转而去调用后备方案再进行full gc,停顿时间就很长)。基于标记-清除算法会有很多碎片,需要额外时间进行处理。

        G1收集器:面向服务端应用,可以独自管理整个gc堆,基于标记-整理,可以预测的停顿时间。将堆划分为大小相等的region,根据region的回收价值进行回收

         初始标记,并发标记,最后标记,筛选回收

11 . Volatile类型变量

Java提供的轻量级同步机制,用其修饰的变量有两种特性,第一是保证此变量对所有线程的可见性,普通变量的值在线程中传递需要通过主内存来完成。但在java中的运算不是原子操作,导致volatile运算在并发下也不一定是安全的。第二是禁止了指令的重排序优化。Volatile的开销小于锁的开销。

在符合运算结果不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值,变量不需要和其他的状态变量一同参与不变约束的情况下。使用volatile可以保证原子性。

12. JVM常见参数

Xmx :heap的最大值

Xms :heap的初始值

Xmn :young区的大小

Xss : stack的大小

Xx:permsize : 永久区的大小(初始)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java虚拟机(JVM)是负责运行Java应用程序的软件。下面是一些常见的Java JVM面试题及其答案: 1. 元空间会产生内存溢出吗?在什么情况下会产生内存溢出? 元空间不会产生内存溢出。元空间是JVM中用于存储类和元数据的区域,它的大小不受JVM堆内存限制。当元空间中的类和元数据数量超过了元空间的限制,会抛出OutOfMemoryError错误。 2. JVM内存模型中的哪些区域是线程私有的? JVM内存模型中,线程私有的区域包括程序计数器、虚拟机栈和本地方法栈。 3. 什么是OOM异常?它通常在什么情况下发生? OOM(Out of Memory)异常表示内存溢出。当JVM无法为应用程序分配足够的内存时,就会抛出OOM异常。常见的内存溢出情况包括堆内存不足、栈溢出和元空间溢出。 4. JVM的垃圾回收算法有哪些? JVM的垃圾回收算法包括标记-清除算法、复制算法、标记-整理算法和分代收集算法。 5. 什么是垃圾回收器?JVM中有哪些常见的垃圾回收器? 垃圾回收器是负责执行垃圾回收的组件。在JVM中,常见的垃圾回收器包括Serial、Parallel、CMS和G1等。 6. JVM调优的方法有哪些? JVM调优的方法包括调整堆内存大小、选择合适的垃圾回收器、优化代码以减少内存占用、减少对象的创建和销毁等。 7. 什么是类加载器?有哪些不同类型的类加载器? 类加载器负责将类字节码加载到JVM中,并在运行时动态加载类。在Java中,常见的类加载器包括启动类加载器(Bootstrap Class Loader)、扩展类加载器(Extension Class Loader)和应用程序类加载器(Application Class Loader)。 8. JVM的性能调优工具有哪些? JVM的性能调优工具包括jstat、jmap、jstack、VisualVM等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值