虚拟机总结给面试的你-Java (虚拟机的)

教程大全 2025-07-18 01:45:56 浏览

Java 虚拟机总结给面试的你

2018-02-24 12:54:51本篇主要针对Java虚拟机的晚期编译优化,Java内存模型与线程,线程安全与锁优化进行总结,其余部分总结请点击Java虚拟总结上篇 ,Java虚拟机总结篇。

本篇主要针对Java虚拟机的晚期编译优化,Java内存模型与线程,线程安全与锁优化进行总结,其余部分总结请点击Java虚拟总结上篇 ,Java虚拟机总结篇。

一.晚期运行期优化

即时编译器JIT

即时编译器JIT的作用就是热点代码转换为平台相关的机器码,并进行优化,它并不是一个虚拟机所必须的部分,只能说有它是锦上添花。

热点代码

热点代码分类

热点探测判定方法

编译过程(Client Complier)

***阶段

第二阶段

第三阶段

优化方法

公共子表达式优化

当一个表达式A的结果已经计算过了,且A中的所有变量都没有发生过变化,那么下一次要用到A时就不用计算了,而是直接取之前A的结果。

数组边界检查消除

方法内联

逃逸分析

逃逸的定义:一个在方法里定义的变量,作为参数传递给其他方法(方法逃逸),或者赋值给类变量(线程逃逸)。

优化方法:

栈上分配:不会逃逸的对象就不在堆上分配了,就在栈上分配,那么对象所占的空间就可以随栈帧的出栈而销毁,减少垃圾收集系统的压力。

同步消除:如果一个变量肯定不会逃逸出线程,那么关于这个变量的同步措施就可以去掉。

Java 虚拟机总结给面试的你

二.Java内存模型与线程

内存模型

说了这么多的内存模型,到底什么是内存模型呢?

特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。

它的作用是定义程序中各个共享的变量的访问规则,即如何将变量写入内存和从内存中取出变量。Java内存模型有主内存与工作内存之分,所有变量存在主内存中,线程则是拥有自己的工作内存,它是主内存的副本拷贝,线程只能读写工作内存。

8种原子操作

volatile变量的特殊规则

虚拟机的

volatile的特性是保证此变量对所有线程的可见性,即当变量的值修改后,其他线程可以立即知道发生的变化。普通变量则是修改完值后,需要写回主内存,然后其他线程再从主内存读取该数据。volatile还可以通过内存屏障来禁止指令的重排序。综合来讲它的读操作和普通变量差不多,写操作慢一点。

long和double变量的特殊规则

8种操作一般都是原子性的,但是对于64位的数据,内存模型允许将没有被volatile修饰的64位数据的读写操作划分为两次32位的操作进行—->非原子协定但一般我们不需要将long和double声明为volatile。

先行发生原则

Java与线程

Java的Thread类大多API都是Native方法,是与平台相关的。

实现线程的三种方式

线程的调度

协同式调度

线程的执行时间由线程自己控制,执行完后再主动通知系统切换线程,可能会导致一个线程长时间地阻塞

抢占式调度

由系统分配时间,线程可以主动让出时间但是不能主动获得时间,通过设置优先级确定顺序

线程的状态

三.线程安全与锁优化

线程安全的程度,依次减弱

线程安全的实现方法

1、互斥同步

synchronized关键字会在代码块的前后分别形成monitorenter和monitorexit指令,这两个指令需要一个reference对象参数,该锁有一个计数器以实现同步,进入时将计数器+1,退出时-1,本线程可重入,其他线程需阻塞等待。synchronized的缺点是由于Java线程是映射到操作系统的,所以唤醒阻塞一个线程都需要系统帮忙,需要从用户态转到内核态,耗费很多处理器时间。

ReentrantLock对synchronized的优势:

2、非阻塞同步

为了解决线程阻塞和唤醒所带来的性能问题,先对共享数据进行操作,如果没有竞争就成功了,否则就补偿(不断重试直到成功)

3、无同步方案

锁优化

锁优化的方案有以下几种:


java虚拟机是什么?

Java语言写的代码是文件,它会被特定程序编译(,它会被Eclipse之类的IDE调用)成字节码(bytecode),字节码不能直接在CPU上运行,需要另一个程序读取并执行,这个部件就是java虚拟机,它像机器一样运行编译好的java字节码,就像机器直接执行机器码一样……java虚拟机的外部接口在windows下主要是这个文件……

java虚拟机的作用是什么! 和虚拟机一样?

Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。 Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。

什么是java虚拟机,简述其工作机制

Java虚拟机处于机器和编译程序之间,在任何平台上都提供给编译程序一个共同的接口。 Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。 Java虚拟机的主要任务是装载class文件并且执行其中的字节码。 Java虚拟机包含一个类装载器,它可以从程序和API中装载class文件。 字节码由执行引擎来执行。 Java虚拟机结构 类装载器的体系结构是Java虚拟机在安全性和网络移动性上发挥重要作用的一个方面,图中所示的类装载器可以包含多个类装载器的子系统, Java应用程序能够在运行时决定需要安装的类,并且将被不同的类装载器装载的类存放在不同的命名空间。 执行引擎处于Java虚拟机的核心位置,它的行为由指令集所决定,其主要作用就是解释字节码(即运行经过编译后的Java程序的class文件) ,不同的执行引擎实现可能非常不同。 由软件实现的虚拟机的执行引擎分为一次性解释字节码、即时编译器和自适应优化器,由硬件芯片构成的虚拟机用本地方法执行Java字节码,它的执行引擎是内嵌在芯片里。 Java虚拟机相当于一个堆栈计算机,它在指令间传送信息时不使用任何物理寄存器,而使用堆栈的帧来表示方法的状态、字节码的操作对象、方法的参数空间及局部变量的空间,它的“程序计数器”为一个伪寄存器,是当前所执行指令的字节码数组的一个指针。 Java实现方法 Java有两种实现方法:Java方法和本地方法。 Java方法是由Java 语言编写,编译成字节码,存储在class文件中。 本地方法是由其他语言(比如C,C++,或者汇编语言)编写的,编译成和处理器相关的机器代码,保存在动态连接库中,格式是各个平台专有的,它是联系Java程序和底层主机操作系统的连接方法。 Java方法与平台无关,但是本地方法却不是,运行中的 Java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。 通过本地方法, Java程序可以直接访问底层操作系统的资源,使程序和特定的平台相关,一个本地方法接口——Java本地接口(JNI)使得本地方法可以在特定的主机系统的任何一个Java平台上运行。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐