什么是JVM
(JVM)是java虚拟机的缩写,通俗的来说就是在java不同的平台上运行不需要重新编译,使java语言编译程序生成在java虚拟机运行
概述
java虚拟机平台是硬件组成的:硬件架构,如处理器,堆栈等等,
java语言最重要的特点是跨平台运行,使用JVM支持操作系统无关,实现跨平台.
JVM作用有:跨平台和内存管理
**跨平台:**JVM也是一个软件,不同的平台有不同的版本。我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件。Java虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后运行。也就是说,只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行我们编写的Java程序。
运行时数据区域
一、什么是运行时数据区?
二、运行时数据区都包括哪些区域?
三、各个区域的作用是什么?
1.什么是运行数据区?
Java虚拟机在执行Java程序的过程中,会将涉及的数据划分到不同的内存区域去管理,而这部分区域就是我们接下来要主要讲解的运行时数据区,也就是Java虚拟机的运行时数据区。
2.运行时数据区都包括那几个区域?
1、线程私有区域:1) 程序计数器 2) 虚拟机栈 3) 本地方方法栈
2、线程共享区域:4) 方法区 5) 堆
3.各个区域的作用是什么?
1、程序计数器
程序计数器是线程私有内存,是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError的区域。它可以看作是当前线程所执行的字节码的行号指示器。程序执行过程中,通过改变这个计数器的值来选取下一条需要执行的字节码指令来完成下一步的操作。每条线程都有一个独立的程序计数器,各线程之间互不影响,独立存储,故称之为线程私有内存。线程私有内存的生命周期与线程相同,线程的结束也就意味着内存生命周期的完结。
2、虚拟机栈
虚拟机栈也是线程私有内存,虚拟机栈描述的是java方法执行的内存模型。整个线程执行过程中,每个方法对应着虚拟机栈中的一个栈帧,方法调用对应着一个栈帧的入栈,方法执行结束对应着一个栈帧的出栈。
栈帧:
栈帧内部“数据结构”主要由这几个部分组成:局部变量表、操作数栈、方法出口等信息。
局部变量表:栈帧中一块用来存储方法中的方法参数和局部变量的区域。
操作数栈:也被称为操作栈,是栈帧中用来执行计算的一块区域。动态链接:每个栈帧中都包含一个指向运行时常量池中该栈帧所属方法的引用,这个引用在运行期间转化为直接引用,来获取方法的元信息。
方法返回地址:一个方法执行结束后应该回到的位置地址。
3、本地方法栈
本地方法栈与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行java方法,而本地方法栈则为虚拟机执行Native方法。
在Sun HotSpot虚拟机中,直接把本地方法栈和虚拟机栈合二为一。
4、Java堆
Java堆是被所有线程共享的一块内存区域,在虚拟机启动式创建。此内存区域的唯一目的就是存放对象实例(以及数组)。
Java堆是垃圾收集器管理的主要区域,也被成为GC堆。
5、方法区
方法区与Java 堆一样,也是被所有线程共享的一块内存区域。它用于存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。
运行时常量池:是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。
垃圾回收算法
1.标记-清除算法
标记-清除算法分为两个阶段:标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占用的空间。
优点:简单
缺点:容易产生大量碎片
2.复制算法
它将可用内存划分为两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题。
优点:简单,不易产生碎片
缺点:可用内存变少,且如果存活对象较多,则复制的效率会大大降低
3.标记-整理算法
该算法标记阶段和清除算法一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。
优点:不易产生碎片,充分利用可用内存空间
缺点:用户等待时间变长