jvm面试总结

JVM总结
类加载机制:
类加载的五个过程:

  1. 加载:类加载获取二进制字节流,将静态储存结构转换成方法区的运行时数据结构 ,并生成该类的class对象,
  2. 验证:验证文件格式,字节流等,确保该class的信息符合java虚拟机
  3. 准备:为类变量分配内存并设置初始化值,这些变量使用的内存都在方法区中进行分配
  4. 解析:将常量池的符号引用变为直接引用,包括类解析,接口解析。字段解析等。
  5. 初始化:执行类中定义的Java代码

类加载器用来加载java类到java虚拟机中

Java的引用类型:

强引用:当内存不足的时候,JVM宁可出现OutOfMemoryError错误停止,也需要进行保存,并且不会将此空间回收。在引用期间和栈有联系就无法被回收

软引用:当内存不足的时候,进行对象的回收处理,往往用于高速缓存中;mybatis就是其中

弱引用:不管内存是否紧张,只要有垃圾了就立即回收

幽灵引用:和没有引用是一样的

类加载器和类如何加载:

双0亲委派模型(一个类加载器接收到了类加载请求,先给父类加载,如果父类完不成。子类在去尝试加载)
类加载是通过双亲委派模型加载的,所有的请求都会到启动类加载器中
优点:类加载具备了优先级的层次关系,避免了各种加载造成应用程序变的一片混乱

Jvm由那些部分组成:
类加载器,执行引擎,本地方法调用,内存区
什么是jvm
Jvm 是java的虚拟机,是可以跨计算机结构体系来执行java字节码的

Jvm的内存结构:

堆:储存所实例对象的内存,每个对象头都有个指针去指向方法区的该对象的类元信息,是jvm虚拟机中最大的一块,垃圾回收的主要区域,因此也叫GC堆

虚拟机栈:每调用一个方法就会在栈中开辟一个空间,叫做栈帧,每个栈帧中都有,局部变量表,操作栈数,动态链接,方法出口,每个方法执行完要执行出栈

方法区:储存变量,常量,静态变量,还有对象的类元信息

本地方法栈:存储标有native的本地方法。现在很少用了。主要是为了在调用c/c++

程序计数器:每个线程私有的,每一个线程都有一个独立的程序计数器,他是该线程在执行的行号指示器,通过改变计数器来确定下一条指令,异常处理和线程恢复都是根据它来完成
注:(方法区和堆是线程共有的,其余都是线程私有)

GC垃圾回收
怎么确定垃圾是否回收:有俩种方法
1. 引用计数法
每当创建一个对象就会为该对象生成一个计数器,每次引用计数器加一,引用失败计数器减一,直到计数器减为0,该对象则为垃圾回收的对象,这个方法简单容易,但是该方法避免不了对象的循环问题,会造成内存溢出,所以商用 不用这种方法
2.可达性分析性法:
判断该对象和GCroot之间是否有引用链,如果没有则该对象成为回收对象,GCroot就是比较常用的一些对象,

垃圾回收的算法:

  1. 标记清除算法:优点:回收效率高,实现原理简单,
    缺点:清除后,会产生大量不连续内存碎片

  2. 复制算法:这种算法是复制后再清理,可以避免产生的不连续碎片问题,但是有缺点,内存利用率高目前只有百分之50的

注:堆分为年轻代,老生代,永久代(新版永久代已经删除)

  1. 标记-整理算法:
    优点:这种算法会自动整理内存,不会产生内存不连续碎片
    缺点:因为中途涉及到整理,没有标记清除法效率高

GC收集器

Serial系列收集器:
单线程收集器,手机垃圾过程中必须停掉所有线程,这类收集器停顿时间最长

ParNew收集器:
多线程收集器,停顿时间比serial时间短,回收新生代垃圾,可以和CMS配合使用
CMS收集器:
多线程收集器,用于收集老生代垃圾,回收速度快,停顿时间最短(即使有停顿,停顿时间特别短),因为引入了并发回收垃圾机制

缺点:用的回收算法是标记清除算法,产生大量内存碎片,需要整理
会产生浮动垃圾,就得下一次回收
和所有工作线程一起执行,会抢占cpu,降低工作线程的效率

CMS设计机制分为四个阶段

  1. 初始标记:有停顿
  2. 并发标记:没停顿和工作线程一起工作
  3. 重新标记:有停顿
  4. 并发清除:没停顿和工作线程一起工作

Paraller系列收集器:
多线程收集器,不考虑停顿的长短,大吞吐量的收集垃圾 列:hadoop

GI收集器:
GI收集器是java最新的收集器,他在jdk1.7开始商用,他结合了cms和paraller的优点停顿时间短和大吞吐量,他把整个堆划分成一个个的小区域块,提高了整个内存的理由率,也降低了fullGC的频率

结束生命周期
执行了system.exit()
程序正常执行结束
程序在执行过程中出现 遇到了异常或者错误终止
操作系统出现了错误导致Jvm进程终止

请解释StackOverflowError和OutOfMemeryError的区别?

答:StackOverflowError栈溢出,一般由于递归过多,调用方法过多导致

OutOfMemeryError堆内存溢出,即OOM,由于堆内存中没有被GC回收的对象过多导致。

出现OOM的原因:

(-).Java虚拟机的堆内存设置不够,可以通过参数-Xms和-Xmx来调优

(二)程序中创建了大量对象,并且长时间不能被被垃圾回收器回收(存在引用)

几种常用的内存调试工具:jmap、jstack、jconsole、jhat

jstack可以看当前栈的情况,jmap查看内存,jhat 进行dump堆的信息
mat(eclipse的也要了解一下)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《CSDN Java面试宝典》是一本专门针对Java开发岗位面试所准备的参考书籍。该书的主要目的是帮助读者更好地准备Java开发岗位的面试,并提供一些常见的面试题及其详细解答。 该书的内容主要包括Java基础知识、面向对象编程、多线程并发、集合框架、IO操作、网络编程、数据库操作、JVM原理、设计模式、常见算法与数据结构等方面的知识。通过对这些知识点的系统性整理和深入讲解,读者可以加深对Java开发相关知识的理解和掌握。 《CSDN Java面试宝典》不仅提供了知识点的详细讲解,还特别关注了面试过程中常见的问题。在书中,作者列举了一些常见的面试题,并对每道题目给出了详细的解答,涵盖了解题思路、代码实现、常见错误等方面内容。这些经典的面试题和答案可以帮助读者更好地理解和掌握Java开发中的常见问题,提升自己的面试技巧。 除了知识点和面试题的讲解,该书还提供了一些面试经验和技巧。作者通过自身的经验,总结了一些常见的面试技巧和注意事项,并给出了一些实用的建议,帮助读者在面试过程中更加从容和自信。 总之,《CSDN Java面试宝典》是一本非常实用的Java面试参考书籍,适合对Java开发岗位面试感兴趣的读者阅读。通过学习和掌握书中的内容,读者可以提升自己在Java开发领域的技能水平,更好地应对面试挑战,获得理想的工作机会。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值