JVM学习篇一:认识运行时数据区

什么是虚拟机

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。(百度百科)

虚拟机作用

直接甩图

image

从图中可以看出,虚拟机就是将字节码解释为操作系统能够执行的字节码文件。JVM 通过执行 Java bytecode 可以使 java 代码在不改变的情况下运行在各种硬件之上。

JVM,JDK,JRE关系


可以看出,JDK(Java Development Kit),java开发工具包包含JRE(Java Runtime Environment)java运行时环境以及Development Tools,而JRE包含JVM以及JAVA API

jvm结构

运行时数据区(Runtime Data Areas)

在这里插入图片描述

由上面两张图可以得到很多信息

线程私有

程序计数器

保存当前正在执行的线程的字节码的行号:控制循环,跳转,分支,异常处理等 唯一没有OOM

Java虚拟机栈

每一个方法都会对应一个栈帧,保存着局部变量表, 操作数栈,动态链接方法出口,一个方法的执行就对应着栈帧的入栈和出栈,局部变量表存放着编译器可知的基本数据类型,对象的引用,returnAddress(执行字节码指令的地址)。虚拟机栈所需内存空间在编译器完成分配,当请求栈的深度超过允许的深度,会抛出StackOverFlow异常,扩展时无法申请到足够的内存,会抛出OOM
-Xss 指定Java虚拟机栈大小

本地方法栈

JVM运行Native方法服务

线程公有

堆:保存对象的实例,垃圾收集的主要区域,又称GC堆。
分为新生代和老年代,新生代又分为Eden,from Survivor,to Survivor,
比例为8:1,利用率达到90%。划分的目的就是为了更好地回收内存。
Java堆可以不是物理上连续的内存空间,就像我们的磁盘一样。
可以动态拓展。
-Xms 和 -Xmx ,指定最小和最大,当堆中没有内存完成实例分配,并且不能再动态拓展时,抛出OOM

堆结构

方法区

保存着类信息,常量,静态变量以及即时编译器编译后的代码,当无法满足内存分配的需要时,抛出OOM
和堆一样不需要连续的内存,并且可以动态扩展,动态扩展失败一样会抛出 OutOfMemoryError 异常。

运行时常量池

是方法区的一部分,Class文件中除了类版本,字段,方法,接口等描述信息,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用。


在 JDK 1.4 中新加入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存(Native 堆),然后通过一个存储在 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。
这样能在一些场景中显著提高性能,因为避免了在 Java 堆和 Native 堆中来回复制数据。


控制参数
-Xms设置堆的最小空间大小。
-Xmx设置堆的最大空间大小。
-XX:NewSize设置新生代最小空间大小。
-XX:MaxNewSize设置新生代最大空间大小。
-XX:PermSize设置永久代最小空间大小。
-XX:MaxPermSize设置永久代最大空间大小。
-Xss设置每个线程的堆栈大小。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值