java虚拟机源代码,Java虚拟机源代码量

作者:高方托管网 2024-09-22 11:10:28 0

大家好,今天小编关注到一个比较有意思的话题,就是关于java虚拟机源代码的问题,于是小编就整理了3个相关介绍java虚拟机源代码的解答,让我们一起看看吧。

什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

就是把JAVA字节码解释为机器语言的解释器,JAVA虽然编译成了字节码,但机器不能识别,还要进一步解释为机器码才能执行。这个算不上虚拟机,就是个解释器。和VB PHP这类解释器没有分别。不同平台使用不同解释器就能跨平台了。

java虚拟机源代码,Java虚拟机源代码量

JAVA虚拟机,俗称JVM(JAVA Virtual Machine)!是运行JAVA代码的抽象计算机!

我们知道JAVA最重要的特性就是跨平台,借此能让JAVA运行在智能手表,手机,游戏机,电脑等大部分的平台上,其原因就是因为JAVA源码运行在JVM中,JVM提供了跨平台实现!

为什么JAVA能跨平台?不同的操作系统会有不同的指令集,将高级编程语言转化为汇编语言,进一步的解释为只有0和1机器码由操作系统执行,而JAVA官方根据不同的操作系统定制了一套不同的JVM,能把相同的源码根据不同的指令集解释为不同的机器码以执行!真正实现了与平台无关,让JAVA开发者脱离底层的语言开发,而专注于业务应用开发!

JVM模拟了一套硬件计算机环境,有一套自己的字节码指令集,堆,栈,方法区,包括寄存器等!

在JAVA类加载和运行的时候,会把对象引用,实例对象,静态变量,方法,类等放入不同的区域,提供运行计算式快速的存取数据!

区别于大部分其他的语言,JAVA封装了对于内存的管理,通过提供的垃圾算法(标记清除,标记整理,复制算法等)对内存自动进行回收!

关于JVM的垃圾收集器,内部回收算法,JVM如何运行等,市面上有大量的书籍,因为JVM与运行效率,吞吐量,高并发等息息相关,所以通常为JAVA技术面试的必问知识点,值得大家用功掌握,更多的技术分享,敬请关注。。

JAVA虚拟机中是如何加载JAVA类的?

我们平时都知道通过javac命令将

.java

.class

要想具体搞清楚java类是如何加载的Java虚拟机中,我们需要搞清楚以下几个问题:

一个Java类什么时候开始被加载?

加载Java类的过程是怎样的?

一个Java类从被加载到JVM内存中到这个类被卸载,主要包含以下七个步骤的生命周期。

Java虚拟机并没有规定在什么时候需要加载Java类,但是对于Java类的初始化却有明确的规定,有且只有以下5中情况时候便会立即触发类的“初始化”动作:

遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有初始化,则需要先触发其初始化,代码示例如下:

使用

java.lang.reflect

java哪个关键字可以对对象加互斥锁?

  1. Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。
  2. 互斥属性:即每次只能有一个线程占用资源。
  3. 请求与保持:即已经申请到锁资源的线程可以继续申请。在这种情况下,一个线程也可以产生死锁情况,即抱着锁找锁。
  4. 不可剥夺:线程已经得到所资源,在没有自己主动释放之前,不能被强行剥夺。
  5. 循环等待:多个线程形成环路等待,每个线程都在等待相邻线程的锁资源。

首先,Java中synchronized可以实现对对象加互斥锁。

其次,我们来聊一聊synchronized互斥锁的实现原理。Java虚拟机中,synchronized支持的同步方法和同步语句都是使用monitor来实现的。每个对象都与一个monitor相关联,当一个线程执行到一个monitor监视下的代码块中的第一个指令时,该线程必须在引用的对象上获得一个锁,这个锁是monitor实现的。在HotSpot虚拟机中,monitor是由ObjectMonitor实现,使用C++编写实现,具体代码在HotSpot虚拟机源码ObjectMonitor.hpp文件中。

查看源码会发现,主要的属性有_count(记录该线程获取锁的次数)、_recursions(锁的重入次数)、_owner(指向持有ObjectMonitor对象的线程)、_WaitSet(处于wait状态的线程集合)、_EntryList(处于等待锁block状态的线程队列)。

当并发线程执行synchronized修饰的方法或语句块时,先进入_EntryList中,当某个线程获取到对象的monitor后,把monitor对象中的_owner变量设置为当前线程,同时monitor对象中的计数器_count加1,当前线程获取同步锁成功。

当synchronized修饰的方法或语句块中的线程调用wait()方法时,当前线程将释放持有的monitor对象,monitor对象中的_owner变量赋值为null,同时,monitor对象中的_count值减1,然后当前线程进入_WaitSet集合中等待被唤醒。

到此,以上就是小编对于java虚拟机源代码的问题就介绍到这了,希望介绍关于java虚拟机源代码的3点解答对大家有用。

相关推荐