欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java虚拟机(Java Virtual Machine)

程序员文章站 2022-08-30 08:18:59
JVM(Java Virtual Machine),Java虚机机,是JDK最底层的东西。只要能将源代码编译成字节码(.class)文件,就可以由JVM在不同平台上解释成机器指令来执行。所以,Java语言的平台无关性,实际上是因为有不同平台下的JVM的支持。 自动内存管理机制 Java程序的内存分配 ......

JVM(Java Virtual Machine),Java虚机机,是JDK最底层的东西。只要能将源代码编译成字节码(.class)文件,就可以由JVM在不同平台上解释成机器指令来执行。所以,Java语言的平台无关性,实际上是因为有不同平台下的JVM的支持。

自动内存管理机制

Java程序的内存分配由JVM管理,所管理的内存划分为5个不同的数据区域。自动内存管理可归结为解决两个问题:给对象分配内存以及回收分配给对象内存。

Java虚拟机(Java Virtual Machine)

程序计数器

用途:当前线程所执行的字节码的行号指示器。

生命周期:与线程相同。为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。(线程私有)

虚拟机栈

用途:描述Java方法执行内存模型:每个方法执行会创建一个栈帧入栈,用来存储局部变量表、操作数栈、动态链接、方法出口等信息,方法执行完成时出栈。

生命周期:与线程相同。(线程私有)

本地方法栈

用途:与虚拟机栈类似,给Native方法使用。(线程私有)

生命周期:与线程相同。(线程私有)

堆区

用途:存放对象实例。

生命周期:虚拟机启动时创建。(线程共享)

设置大小:-Xmx和-Xms。

方法区

用途:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

给对象分配内存

以HotSpot虚拟机为例

对象的创建

1、查找对应类的符号引用,没有则加载相应的类。

2、分配内存给新对象。

3、初始化零值。

4、设置对象头信息。(类元数据信息、哈希码等)。

5、初始化对象。

对象的内存布局

1、对象头:存储对象自身的运行时数据,如哈希码、线程持有的锁、GC分代年龄等。

2、实例数据:程序中定义的各种类型的字段内容。

3、对齐填充:起占位符作用,为满足对象起始地址是8字节的整数倍。

对象的访问定位

使用直接指针访问方式,即堆对象的引用直接指向对象地址。

回收分配给对象内存

垃圾收集(Garbage Collection,GC),上面三个线程私有区域在线程结束时内存就随着回收了,所以垃圾回收一般指的是堆区和方法区。

何时回收?

判断对象是存活还是死去,常有两种方法。

一、引用计数算法

给对象中添加一个引用计数器,每当一个地方引用它就加1,引用失效则减1,计数器为0则对象已死。但是Java虚拟机不是用这种,最主要原因是很难解决对象的循环引用问题。

二、可达性分析算法

通过一系列“GC Roots”的对象作为起始点,往下搜索引用对象,搜索所经过的路径称为引用链,当一个对象不在任何一个引用链上时,则该对象已死。(Java虚拟机用这种)

GC Roots的对象包括:

1、虚拟机栈中引用的对象。

2、方法区中类静态属性或常量引用的对象。

3、本地方法栈中JNI引用的对象。

如何回收?

不同厂商、不同版本的虚拟机所提供的垃圾收集器可能会有很大差别,这一块内容就不多深入。

虚拟机性能监控与故障处理工具

JDK的命令行工具

jps:列出正在运行的虚拟机进程。

jstat:监视虚拟机各种运行状态信息。

jinfo:实时地查看和调整虚拟机各项参数。

jmap:生成堆的转储快照。

jhat:与jmap配和使用,分析jmap生成的堆转储快照。

jstack:生成虚拟机当前时刻的线程快照。

JDK可视化工具

JConsole:用来内存监控、线程监控。

VisualVM:强大的运行监控和故障处理程序,还有性能分析等功能。对性能影响小,可直接用于生产环境。

参考文献

1、《深入理解Java虚拟机》 by 周志明