Java1-JVM

JVM基础扫盲

JVM-java virtual machine;不同平台的 JVM 是不同的,向编译器提供的相同的借口,编译器生成的.class字节码文件,不同平台的JVM会解释成与该平台对应的机器码,JVM屏蔽了具体操作系统平台相关的信息,在java扩平台实现中起到转换器的作用。

参考1中的两幅图可以表明java从源文件到编译到解释执行之间的过程。

JVMåå­ç»æ学习æ´ç

JVMåå­ç»æ学习æ´ç

JVM内存模型

 

 

 

ProgramCounterRegister:

一块较小的内存,当前线程所执行的字节码的行号指示器。JVM字节码解释器就是通过改变这个程序计数器的值来选取 下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。任意时刻,一个处理器只会执行一条线程中的指令,为了在线程切换后能恢复到正确的位置,每个线程都需要一个独立的程序计数器,记录该线程执行到哪条字节码指令(字节码指令的地址),线程之间的计数器,独立存储,互不影响,属于“线程私有”的内存。

VM Stack:

线程私有;生命周期与线程相同;每个方法执行的时候都会同时创建一个栈帧(Stack Frame),用于存储局部变量表、操作帧、动态连接、方法出口(返回地址)等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在JVM Stack中从入栈到出栈的过程。

局部变量表存放了编译期可知的各种基本数据类型 (boolean, byte, char, short, int, float, long, double)、对象引用(reference类型,它不等同与对象本身,根据不同的虚拟机实现,它可能是一个指向对象起始地址的额引用指针,也可能指向一个 对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的 数据类型只会占用1个。局部变量表所需的内存空间在编译期完成分配,当进入 一个方法时,该方法在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

两种异常类型:

StatckOverFlowError:线程请求的栈深度大于JVM允许的深度;

OutOfMemoryError:JVM  Stack可以动态扩展,扩展时无法申请到足够的内存;

Native Method Stacks:

与JVM Stack相似,VM Stack为虚拟机执行Java方法(字节码)服务,而本地方法栈为 虚拟机使用的Native方法服务。

Java  Heap(堆):

JVM管理的内存中最大的一块。被所有线程所共享的一块内存区域。虚拟机启动时创建。

此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。Java堆可以处于物理上不连续的内存空间中,只要逻辑上连续即可,就像磁盘空间一样。

Java堆是垃圾收集器管理的主要区域,也称作GC堆(Garbage CollectedHeap)

OutOfMemoryError:堆中没有足够的内存完成实例分配,且无法扩展。

Method Area:

存储类结构信息(类、接口、字段 、方法的列表)的地方,包括常量池、静态变量、构造函数等类型信息,类型信息是又类加载器在类加载时从类文件中提取出来的。

线程共享的。

同样存在垃圾收集,用户通过自定义加载器 的一些类同样会成为垃圾,JVM会回收一个未被引用类所占的空间,以使方法区的空间达到最小。

Direct Memory

直接内存 又称堆外内存,也就是说这不是jvm运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,但这部分也会被频繁的使用,而且也可能导致OOM。

堆外内存优点
1 减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作 
2 可以提高性能,避免java堆和native堆(直接内存)来回复制数据。

使用场景 
1.在JDK1.4之后加入了NIO,引入了一种基于通道与缓冲区的I/O方式,它可以使用Native库函数直接分配堆外内存,然后通过DirectByteBuffer对象作为这块内存的引用来进行操作,jvm会自动对这部分的堆外内存进行回收。 
2.使用jdk内部未对外公开的unsafe来直接使用堆外内存,但不会被JVM回收


参考1:https://yq.aliyun.com/ziliao/302278

参考2:https://www.cnblogs.com/jiyukai/p/6665199.html

参考3:https://www.cnblogs.com/dingyingsi/p/3760447.html

参考4:https://blog.csdn.net/jsjsjs1789/article/details/77622037

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值