Java面试之虚拟机原理

     Java程序员面试的时候,谈谈虚拟机,显得高大上,显得水准高。本文只负责简单的讲解,通俗易懂,可以应对面试时的一些问题。当然遇到高手的时候,肯定会折了,所以要深入的学习原理的同学请绕道看书。

     先谈虚拟机基本的体系结构:类加载器、运行时数据区、执行引擎。 
  1. 类加载器ClassLoader:用来加载class文件到jvm,使用委托模式加载类,加载一个类时,先委托父加载器加载。
    面试题:平常写代码不会用到ClassLoader,在什么情况下可能使用到呢?
    例如算法竞赛的在线评测系统,允许用户上传Java代码,在后台动态编译成class字节码,此时就可以用到ClassLoader动态加载类。

  2. 运行时数据区:主要分成方法区、堆、Java栈、PC寄存器。
    方法区:存放类加载器加载类的信息,即类定义信息。
    堆:所有的对象都在堆上分布,所有的线程共享。Java堆的实现基于分代原理。hotspot将堆分成新生代、年老代。新生代分为伊甸园和两个幸存者区。新建对象时会首先分配在新生代的伊甸园,如果是大对象会直接分配在年老区。
    Java栈:每个方法执行的时候都会有自己的Java栈,所以方法内的本地变量是线程安全的。

    面试题:什么时候会引起堆溢出 HeapOverflow,什么时候会引起栈溢出 StackOverflow?
    堆是用来分配对象的,只要新建对象需要的内存大于剩余的内存就会发生堆溢出。如死循环中不断的new对象,又比如直接申请一块超大的内存
     byte[] bigMemory = new byte[1024 * MB]
    栈溢出就是方法不断的执行,比如死循环,或者递归调用时没有正确的终止条件。

  3. 执行引擎:虚拟机的核心,执行行为由指令集来定义。
     另一个比较经常谈到的是GC的工作原理。
  • 分类:Full GC 和 Minor GC 分别用来回收年老代和新生代。通常Full GC发生时会伴随着一次minor GC,而且时间上Full GC比minor GC更长,还会造成应用的暂停。
  • 算法:垃圾回收常用算法有引用计数、标记清除、复制算法等。
     
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值