java虚拟机

初识JVM

无人久伴 提交于 2020-12-18 02:41:45
初识JVM: 大纲: n JVM的概念 n JVM发展历史 n JVM种类 n Java语言规范 n JVM规范 JVM的概念: n JVM是Java Virtual Machine的简称。意为Java虚拟机 n 虚拟机 – 指 通过软件模拟 的 具有完整硬件系统功能 的、 运行在一个完全隔离环境中 的 完整计算机系统 n 有哪些虚拟机 – VMWare – Visual Box – JVM n VMWare或者Visual Box都是使用软件模拟物理CPU的指令集 n JVM 使用软件模拟 Java 字节码的指令集 Java和JVM的历史: n 1996年 SUN JDK 1.0 Classic VM – 纯解释运行,使用外挂进行JIT n 1997年 JDK1.1 发布 – AWT、内部类、JDBC、RMI、反射 n 1998年 JDK1.2 Solaris Exact VM – JIT 解释器混合 – Accurate Memory Management 精确内存管理,数据类型敏感 – 提升的GC性能 – JDK1.2开始 称为Java 2。J2SE, J2EE, J2ME 的出现加入Swing Collections n 2000年 JDK 1.3 Hotspot 作为默认虚拟机发布,加入JavaSound n 2002年 JDK 1.4 Classic VM退出历史舞台

一、JVM运行时数据区域

孤人 提交于 2020-03-16 18:55:19
某厂面试归来,发现自己落伍了!>>> JVM运行时数据区 其中 方法区 和 java堆 为 多线程共用区域 其余为现成私有区域 程序计数器: 当前线程执行的字节码的行号的存放空间,字节码解释器通过改变这个值来获取下一条执行字节码,各条线程都独立,互不影响; 如果正在执行的是Java方法,则在计数器中记录的是虚拟机字节码指令的地址; 若是Native方法,则记录的值为Undefined; 此区域没有规定OutOfMemoryError Java虚拟机栈: 用于存放局部变量 虚拟机栈用于存储编译期可知的基本类型(int、long等)、对象的引用(实例在java堆中地址)和一条字节码指令的地址 栈帧:每个方法执行时会把方法的局部变量、操作数栈、方法出口等信息存到一个栈帧中,即一个方法的执行就是一个栈帧从入栈到出栈的过程 每个方法在编译期会把方法中局部变量所占用的空间进行分配,即在方法执行可以得到的局部变量空间是完全确定的 本地方法栈: 用于存放本地方法(即用native关键字修饰的方法) 虚拟机对于方法的语言、使用方式和数据结构都没有特殊的规定,可有虚拟机自己实现 Java堆: JVM内存管理中最大的一块 用于存放对象实例和数组 垃圾回收的主要区域 方法区(有些地方叫 -- 非堆): 用于存放已经被虚拟机加载的类信息、常量、静态变量等数据 常量池:类信息中的一部分,用于存放字面量

关于JVM中long和double的读取原子性

为君一笑 提交于 2019-12-17 14:21:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 今天看《Java并发编程实战》的书中,关于long和double的原子性有这么一段话,意思就是在JVM中,对于32位(或者以下)的数值变量都是原子性读写,但是对于long和double这种64位的操作是非原子性。分成两次32位的操作。 在以下这种操作中就会出现读取的数值错误。 线程A先写高位32位操作, 线程B读高位32位, 线程B读地位32位, 线程A写地位32位。 那么解决办法就是对变量加上volatile关键字,volatile关键字有3个主要功能,第一个就是可见性,每次直接从内存读写。第二个就是禁止指令重排序,在JVM中会对指令进行优化,优化的时候可能会对指令进行排序。第三个就是对volatile修饰的变量读取都是原子性的。 但是书上没有说操作系统的位数和JVM的位数。 所以我猜想,只有64位JVM+64位操作系统+64位硬件才能实现对64位long和double的原子性读取。 来源: oschina 链接: https://my.oschina.net/u/2250599/blog/533108

再深一点,理解线程的join方法

孤者浪人 提交于 2019-12-09 11:11:11
配图:曲径通幽 讲真,如果不是被面试官吊打,join()方法也还不会引起我的重视。因为,工作中确实没有使用过它。 现在,对它来个刨根问底。 join()方法的作用 在写这篇文章之前,我对join的理解只停留在字面意思“把指定线程加入到当前线程”。 再来看官方怎么解释的: //Waits for this thread to die. public final void join() throws InterruptedException { join(0); } “Waits for this thread to die.”,也就是等着join()方法所属的 线程死亡(run方法执行完毕正常结束或线程异常死亡)。 下面举个例子,证实这个说法。 举个栗子 import static java.lang.System.out; public class JoinTest { public static void main(String args[]) throws InterruptedException{ String threadName = Thread.currentThread().getName(); out.println(threadName + " is Started"); Thread th1 = new FooThread(); th1.start(); th1

JVM 之 Class文件结构

大城市里の小女人 提交于 2019-12-02 20:36:42
JVM 之 Class文件结构 本文写作目的: 1)为了加深自己学习的理解,2)帮助正在学习研究JVM的同仁,3)与任何热爱技术的达人交流经验,提升自己 以此为本,文章会尽量写的简洁,尽量保证理解的正确性,如有任何理解不到位或错误的地方,希望朋友们及时指出,严厉拍砖。 开始之前我们需要先了解一些基本的概念,这些概念是学习整个JVM原理的基础。 1)JVM虚拟机规范主要规范了Class文件结构,虚拟机内存结构,虚拟机加载,解析,执行Class文件的行为方式,以及一系列的字节码指令集。 2)Class文件理论上说是一种数据结构,该 数据结构有着严格的格式规范,该规范在字节粒度上规定了组成该数据结构的格式标准。 3)Class文件本质上是一组二进制字节流,是被JVM解析执行的数据源,每个字节都有着不同的含义,可能表示字符,数字,也可能表示执行某种操作的一个字节码指令。 4) JVM (Java 虚拟机)是解析执行Class文件的核心引擎,是整个Java系统的运行时环境,是跨平台的基石。 5)我们的Java代码需要被编译器编译成完整,正确的Class文件才能被JVM正确的执行。 6)编译器并非JVM的一部分,不同的语言可以提供不同的编译器,其作用是将该语言的代码编译为正确的Class文件,如Scala,JRuby等等。 7)JVM是完全开放的跨平台的

android -------- java虚拟机和Dalvik虚拟机

Deadly 提交于 2019-11-26 16:36:25
java虚拟机 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 Java虚拟机(Java Virtual Machine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一。 Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且 每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。 DVM虚拟机Dalvik Virtual Machine,是安卓中使用的虚拟机。全部安卓程序都运行在安卓系统进程里

JVM学习心得体会 (第一天)

僤鯓⒐⒋嵵緔 提交于 2019-11-26 16:35:57
Java虚拟机 Java虚拟机(Java Virtual Machine) 简称JVM Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。 Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。 java虚拟机是一个标准,可以由不同的厂家用不同的方式(软件或硬件)去实现它,只要他们的实现是符合标准即可。 各个不同厂家实现的java虚拟机 先来看一下java平台的结构图: JVM与JRE、JDK关系?   JVM:Java Virtual Machine(Java虚拟机),负责执行符合规范的Class文件   JRE: Java Runtime Environment (java运行环境),包含JVM和类库   JDK: Java Development Kit