欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java学习之从“底”学起——JVM构造、GC垃圾回收

程序员文章站 2022-07-03 14:54:53
临近秋招,许多小伙伴也开始狂刷面试题,总结面试考点,希望可以在今年这个不太一般的秋天去到心仪的公司。在这里,我来总结一下最近刷Java底层试题以及看面试视频的题型。我的理解是,我们在回答Java方面的知识时,不仅仅是能达到“会用”,我们更要理解其原理是怎么实现的,理解了底层实现,才能决定以后在编程路上走到什么地步,所有语言大同小异,理解了设计思想,什么语言都是一样的。文章目录谈谈你对Java的理解平台无关性基本指令为什么我们不直接将Java源码转化成该平台的机器码Java反射类从编译到执行的过程Clas...

临近秋招,许多小伙伴也开始狂刷面试题,总结面试考点,希望可以在今年这个不太一般的秋天去到心仪的公司。在这里,我来总结一下最近刷Java底层试题以及看面试视频的题型。
我的理解是,我们在回答Java方面的知识时,不仅仅是能达到“会用”,我们更要理解其原理是怎么实现的,理解了底层实现,才能决定以后在编程路上走到什么地步,所有语言大同小异,理解了设计思想,什么语言都是一样的。

谈谈你对Java的理解

Java是什么?如果面试官问了你这个话题,该怎么作答呢?Java可谓是包罗万象,从最初的Sysytem.out.println("hello world"),到类与对象,再到文件、线程、异常处理,乃至Spring、SpringBoot、SpringCloud。这些都是Java,我们似乎被这个话题迷昏了眼睛,一时说不上来,该从那儿开始,这里,我们要做一个Java的框架,将所学过的知识串起来,这样即时面对范围这么庞大的问题,我们也可以知道该怎么回答了。

平台无关性

Java为什么流行,很大一部分原因就是因为其平台无关性,优越的跨平台性能使我们无需关注如何去调用系统指令为我们服务,不管是Linux、MAC OS、WINDOWS乃至其他,只要有了JVM,一切都无需我们去想,只需要一份class文件,JVM就会给我们转化为各个平台上的机器码然后运行。

基本指令

  1. 编译:在有Java环境的机器上,我们可以使用javac将Java源码编译成.class文件(这里需要注意,我们的源码如果语法语义错误,是不会编译成功的),之后供Java虚拟机去运行。
  2. 运行:JVM将我们的.class文件通过java命令加载到JVM中运行。
  3. 反编译:在我们拥有一份.class文件后,我们可以通过反编译,执行javap -c的指令反编译成我们认识的语言。

为什么我们不直接将Java源码转化成该平台的机器码

为什么要转化一个中间文件.class文件?通过JVM直接转化成该平台机器码不是更省事儿吗?原因如下,上文提到,我们在进行.class文件编译时,需要对Java源码进行检查,通过后才可以转化,转化成功后就表明语法没问题,这个.class文件就可以拿到任意一个平台去执行,但是如果没有这一步,我们刚在Linux运行了Java文件,转头相同的文件在Win上执行,还得再检查一遍,更加浪费了时间以及JVM的性能。
平台复用性:既然Java虚拟机有这么好的转化机制,我们也可以将其他语言转化为字节码文件,交给Java虚拟机去执行,这样,就符合了计算机系统中复用的理念。

Java反射

反射:在运行状态下,我们可以获取到任意一个类的属性和方法,也可以获取到任意一个对象的方法和属性,这种动态获取类信息以及动态调用对象的机制称为反射。
举个栗子