JVM(JDK1.8之后的最新整理)

一、JVM是什么?

 JVM是JAVA虚拟机,用来执行JAVA的字节码文件(.class)

JAVA优秀的跨平台性(一处编写,处处运行)的核心就是JVM

二、JVM的三大种类

Sun HotSpot

提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。

BEA JRocket

专注于服务端应用(JRockit内部不包含解析器实现,全部代码都靠即时编译器编译后执行)。

Jrockit JVM 是世界上最快的jvm3. 2008年被oracle收购。

专注于服务器端的应用。

它不太关注程序的启动速度,因此JRockit内部不包含解析器的实现,全部代码都靠及时编译器编译之后执行。

iBM J9

市场定位与hotspot接近,服务器端,桌面应用,嵌入式等。

目前,是影响力最大的三大商业虚拟机之一。

应用于IBM的各种Java产品。

三、JVM的工作原理图

四、JVM分区作用

程序计数器:

可以看作是当前线程执行字节码文件的一个行号指示器,通过程序计数器的值来选取下一条需要执行的指令时什么。分支,循环,跳转,异常处理,线程恢复都是由它来实现。如果执行的是一个本地方法,那么计数器为空。

每个线程都有私有的程序计数器,它的生命周期随线程的启动而产生,随线程结束而消亡。它是唯一一个没有规定OutOfMemoryError异常的区域,不存在内存溢出。

栈:

 也是线程私有的,生命周期和线程同步。虚拟机栈描述的是java方法执行的内存模型。并且每一个方法执行的同时都会创建一个栈帧存入虚拟机栈,方法执行完毕,对应的栈帧就会出栈。(栈帧:是方法运行是的基本数据结构。包含了方法的局部变量表,操作数栈,返回地址,动态连接等信息)

对于这个区域,有两种异常状况:

1、如果线程请求栈帧的深度大于虚拟机栈的深度,那就会抛出StackOverflowError异常

2、如果虚拟机栈可以进行动态扩展,但是扩展时无法申请足够的内存,就会抛出OutOfMemeoryError异常。

本地方法栈:

和虚拟机栈它们非常相似,不同在于虚拟机栈用于java方法的调用,而本地方法栈用于本地方法的调用。有的虚拟机直接就把虚拟机栈和本地方法栈合二为一。和虚拟机栈一样。本地方法栈也会抛出StackOverflowError异常和OutOfMemeoryError异常。

( native方法:被native修饰的方法,主要用于加载文件,和动态连接库。它和抽象方法相似,只有方法签名,没有方法体。本地方法无法实行跨平台,它可以被c语言重写。)

方法区:

也是线程共享的区域,用于存储常量,类变量,类信息等数据。如果方法区内存不足,会抛出OutOfMemoryError异常

堆:

是虚拟机所管理内存中最大的一块,几乎所有的对象实例都在这里分配。它在虚拟机启动是就创建了,是被所有线程共享的一块区域。java堆也是垃圾回收管理的主要区域,也就是“GC"堆。从内存分配角度来说,java堆还可以细分成多个线程私有的分配缓存区,进一步细分可以方便更好的进行回收,更快的进行分配内存。其实无论如何划分,都和存放内容无关,都存的是对象实例。

java堆也是可以进行动态扩展的,如果对象没有内存去完成实例分配,并且堆也没法再扩展,就会抛出OutOfMemoryError异常。

 堆的详细图 

五、JVM中GC垃圾回收机制

 5.1 什么是GC

GC是垃圾回收机制,在JAVA中是自动GC的

 5.2 GC分类

轻GC(普通的GC):扫描新生代

重GC:全部扫描

 5.2 GC常用算法

 GC共有四大算法,分为是:复制算法、标记清除算法、标记压缩算法、引用计数法

 GC算法对比:

        内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)
        内存整齐度:复制算法=标记压缩算法>标记清楚算法
        内存利用率:标记压缩算法=标记清楚算法>复制算法

 GC是分代收集算法,即不同的区域选择的算法也是不同的。

新生代:存活率,使用复制算法

老年代:区域大,存活率高,使用标记清除(内存碎片不是很多)

六、JMM(JAVA内存模型)

JMM是什么? 

JMM即JAVA内存模型,是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致,编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。

为了更精准控制工作内存和主内存间的交互,JMM 还定义了八种操作:lock, unlock, read, load,use,assign, store, write。

为了更好的控制主内存和本地内存的交互,Java 内存模型定义了八种操作来实现:

lock:锁定。作用于主内存的变量,把一个变量标识为一条线程独占状态。
unlock:解锁。作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
read:读取。作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
load:载入。作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
use:使用。作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。
assign:赋值。作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
store:存储。作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作。
write:写入。作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。
 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值