jvm基本题库

1. 垃圾回收算法有几种类型? 他们对应的优缺点又是什么?

  • 标记清除算法

1)主要分为2步,标记:确定要回收的对象,做好标记。清除:将标记阶段不可用的对象进行清除

  1. 缺点:效率不高,会产生2次扫描,浪费时间,会产生内存碎片,导致频繁的回收。
  • 标记整理算法

1)把存活对象放内存的一端移动,回收边界以外的内存

2)优点:防止内存碎片产生

3)缺点:多次进行扫描,增加算法复杂度,执行步骤较多

  • 复制算法
  1. 在幸存区(survivor)分成大小相等的两块(from,to),每次使用一块,把存活的对象复制到另一块上,然后把这块内存清理掉

2)缺点:会产生一块多余的内存作为复制区,当存活率较大时,复制算法效率较低

  • 分带收集算法

1)大部分JVM的垃圾收集器采用的算法,根据对象的存活的生命周期划分为不同的区域,划分为新声代,老年代,永久代,那么可以根据不同代的特点采取最适合的算法

2)Young :存放新创建的对象,对象生命周期非常短,几乎用完立即被回收,Eden区; Tenured:young存活下来的对象被转移到tenured区,也叫old区;Perm:永久带,存加载类的信息,存活周期较长

3)缺点:算法复杂度高,执行步骤较多

2. 类的加载过程是什么?简单描述一下每个步骤

  • 加载

通过类的全限定名获取二进制流,再将二进制静态存储结构转换为方法区运行的数据结构,在内存中生成该类的Class对象,作为该类数据访问入口。

  • 连接

1)验证:确保Class文件的字节流不会危害到虚拟机(文件格式验证:符合Class规范,版本在虚拟机范围内,常量池有不被支持的类型;元数据验证:字节码语义分析,继承不被继承的类;字节码验证:方法体的验证;符号引用)

2)准备:为类的静态变量分配内存并将其初始化为默认值,这些内存在方法区内进行分配。 public static int value = 123
不包括实例变量,实例变量会在对象实例化时候一起被分配到java堆中

3)解析:符号引用到直接引用,符号引用:与虚拟机的布局无关,不一定加载到内存,字面量形式明确定义在Java虚拟机规范的Class格式中;直接引用:引用的目标必定在内存中

  • 初始化

类加载的最后一个阶段,真正执行类中定义的JAVA程序代码;初始化阶段是执行类构造器方法的过程。

注意以下不会执行类的初始化:1.通过子类引用父类的静态字段,只会触发父类的初始化,不会触发子类的初始化;通过类名获取Class对象;通过Class.forName,如果参数设定initialize是false也不会初始化;通过ClassLoader.loadClass方法

  • 使用

当JVM完成初始化之后,JVM便开始从入口方法执行程序代码

  • 卸载

当用户程序完毕之后,JVM开始销毁创建的Class对象,最后负责运行的JVM也退出内存

3.JVM 预定义的类加载器有哪几种?分别什么作用?

  • 应用程序加载器(System ClassLoader)

又称系统类加载器,主要用于加载CLASSPATH路劲下自己写的类,如我们手写Student类,通过编译Student.class文件,Class.forName(“com.***.Student”),通过全路径加载进来,Student.class.getClassLoader()得到它的类加载器,得到AppClassLoader(系统类加载器)

  • 扩展类加载器(Extension ClassLoader)

主要加载JAVA的一些拓展类,负责JAVA_HOME\lib\ext目录中的

  • 启动类加载器(BootStrap ClassLoader)

JAVA中的核心类库,JAVA_HOME\lib\rt.jar,由C++编写,程序无法得到

4.双亲委派模式?有什么作用?

当一个类加载器收到加载任务,会先交给父类加载器去完成,因此会传递给顶层启动类加载器,只有当父类加载器无法完成加载任务时,才会自己进行加载。比如加载rt.jar包中的java.lang.Object,不管哪个加载器加载这个类,最终都会委托给启动类加载器,这样不同类加载器最终得到同样的一个Object对象。

5. 内存溢出, 内存泄露? 他们的区别是什么?

  • 内存溢出 out of memory

程序在申请内存空间时,没有足够的内存空间供其使用

解决办法:扩大内存,修改JVM参数;查看日志,查看OutOfMemory异常和错误; 对代码走查和分析,找出内存溢出的位置

  • 内存泄漏 memory leak

程序在申请内存后进行使用(new),使用完毕后,无法进行释放已申请的内存空间,系统也不能将它分配给其他程序,一次泄漏可以忽略,但日积月累堆积后果很严重

解决办法: 资源对象不使用的时候,调用close函数关闭掉;退出程序时,将集合中的东西clear;

6. 类加载内容

在这里插入图片描述

7. 引起类加载操作的行为有哪些?

  • 遇到new,getstatic,putstatic或invokestatic四条字节码指令

  • 反射调用的时候,类如果没有进行初始化,先触发其初始化

  • 子类初始化的时候,如果父类没有进行初始化,先对其父类进行初始化

  • 虚拟机执行主类main

8. 介绍一下JVM常用的工具

  • jps:显示本地java进程,并显示进程号
  • jinfo:运行环境参数 Java System属性和JVM命令参数
  • jstack:jvm当前所有线程运行状况和线程状态 jstack 进程
  • jmap:物理内存的占用情况

9. Full GC 、 Major GC 、Minor GC 之间区别?

  • Minor GC:在新生代(包括Eden和Survivor)回收内存
  • Major GC:清理Tenured区,用于回收老年代区;
  • Full GC:整个新生代,老年代,元空间的全局范围的GC

10. 什么时候触发 Full GC ?

  • 调用System.gc时,系统建议执行Full GC
  • 老年代空间不足
  • 方法区空间不足
  • 通过Minor GC后进入老年代的平均大小大于老年代的可用内存
  • 由Eden,survivor space1(from space)向survivor space2(to space)复制时,对象大小大于To space可用内存,则把该对象转移至老年代,且老年代的可用内存小于该对象大小

的平均大小大于老年代的可用内存

  • 由Eden,survivor space1(from space)向survivor space2(to space)复制时,对象大小大于To space可用内存,则把该对象转移至老年代,且老年代的可用内存小于该对象大小
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值