面试问题详解 -- 对Java平台的理解

本文详细介绍了Java的两大特性:跨平台能力和垃圾回收机制,以及JRE和JDK的区别。Java的跨平台能力得益于Java虚拟机,而垃圾回收机制则简化了内存管理。同时,文章讨论了Java的编译执行和解释执行的混合模式,特别是JIT编译器在优化热点代码方面的作用。JIT分为C1和C2编译器,分别适用于不同场景。热点代码的探测方法包括基于采样和计数器两种。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Java是面向对象的语言,他有两大特性

  • 一是跨平台能力,也就是"书写一次,到处运行",这点与java虚拟机密不可分,不同平台有不同的JDK,安装好对应JDK就有了Java的运行环境;

注意,这里强调的是"书写一次"而非"编译一次",重心并不在"编译"上,这句话是对比c语言的,c语言的书写过程中有许多对系统层面API的调用,不同的操作系统的系统调用封装函数是不同的,所以每次换系统的时候都要更改c语言的源文件。针对java而言,因为虚拟机屏蔽了底层细节,所以用java写出来的代码都是一样的。

  • 第二个特性是java的垃圾回收机制,通过垃圾收集器进行内存的回收分配,大部分情况下,程序员是不需要自己操心内存的分配和回收的。

2、JRE和JDK

  • JRE(Java Runtime Environment)是Java运行环境,包含了JVM和Java类库,以及一些模块等,是运行一个Java程序所必须的;
  • JDK可以看作是JRE的一个超集,提供了更多的工具,比如编译器、各种诊断工具等。

3、"Java是解释执行"这句话是不准确的

下图为Java源文件转化至机器码的过程


Java有编译执行也有解释执行,针对热点代码,jvm 中提供了动态编译器JIT,可以在运行时将代码编译为机器码,这种情况下热点代码就属于编译执行了。
其完整过程是Java源文件首先通过javac编译成为字节码文件,即.class文件,这是可执行文件,接着在运行时JIT将热点代码编译为机器码,剩余代码则通过jvm内嵌的解释器将其解释为机器码。
还有一种新的编译方式,即AOT(Ahead-of-Time Compilation),这种编译方式直接将字节码编译成机器代码,避免了JIT预热等各方面的开销,在JDK9中进行了实验,并且增加了新的jaotc工具来进行编译。

二、如何判断热点代码?

判断一段代码是否为热点代码有两种方法:

  1. 基于采样的热点探测

周期性地去方法栈顶查看被调用的方法,如果是经常出现的就会视为热点代码,这种方法实现简单,但是不精确,容易受线程阻塞和外界因素影响。

  1. 基于计数器的热点探测

hotspot采用此方法,jvm会为方法或者代码创建计数器,这种计数器有两种,一种是方法调用计数器,一种是回边计数器。
其中方法调用计数器是统计一个方法在一定时间内的执行频率,如果在一段时间内两个计数器的值的总和超过某个阈值,jvm就确认其为热点代码,但超过一定的时间限度后该方法还未被认定为热点代码,那这个方法的调用计数器的值就会减少一般,这个过程是计数器的热度衰减。
另一种回边计数器是针对循环体代码的,pc寄存器向后跳一次成为一次回边,这里统计的是实际调用次数,当达到某一阈值的时候触发OSR编译。

三、JIT的具体细节呢?

JVM中有两种不同的JIT compiler :C1和C2

  • C1模式是client模式,编译调用门限是1500次,适用于对启动速度敏感的应用,比如普通的Java桌面应用。
  • C2模式是server模式,会进行上万次调用以收集足够的信息进行高效编译,适用于长时间运行的服务器端应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值