JVM(Java虚拟机)(由生到熟)

本文详细介绍了JVM的各个组成部分,包括程序计数器、虚拟机栈、本地方法栈、Java堆和方法区。讲解了双亲委派机制、垃圾收集算法如复制、标记-清除和标记-整理,以及JVM中的类加载过程和内存管理。此外,还讨论了如何判断对象已"死",并分析了CMS垃圾收集器的工作原理和优缺点。
摘要由CSDN通过智能技术生成

JVM概念

JVM(Java Virtual Machine的简称。意为Java虚拟机。):
指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。 常见的虚拟机有JVM、VMwave、Virtual Box。.JVM和其他两个虚拟机的区别:
1、VMwave与VirtualBox是通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器
2、JVM则是通过软件模拟Java字节码的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都进行了裁剪JVM是一台被定制过的现实当中不存在的计算机

jvm位置

JVM就是一个软件,软件是运行在操作系统之上的,所以JVM的位置就是操作系统之上。

JVM框架:

在这里插入图片描述
在这里插入图片描述
线程私有区域:程序计数器、Java虚拟机栈、本地方法栈
线程共享区域:Java堆、方法区、运行时常量池

对个部分的的解释

程序计数器(线程私有)

是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,就是一个指针,指向下一个要运行指令的地址。如果当前线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是一个Native方法,这个计数器值为空。

虚拟机栈(线程私有)

虚拟机栈描述的是Java方法执行的内存模型 : 每个方法执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口(方法返回地址)等信息。每一个方法从调用直至执行完成的过程,就对应一个栈帧在虚拟机栈中入栈和出栈的过程。声明周期与线程相同。
之前我们一直讲的栈区域实际上就是此处的虚拟机栈,再详细一点,是虚拟机栈中的局部变量表部分(存放了编译器可知的各种基本数据类型(8大基本数据类型)、对象引用等)。

本地方法栈(Native Method Stack)(线程私有)

本地方法栈与虚拟机栈的作用完全一样,他俩的区别无非是本地方法栈为虚拟机使用的Native方法服务,而虚拟机栈为JVM执行的Java方法服务
在HotSpot虚拟机中,本地方法栈与虚拟机栈是同一块内存区域

方法区(Method Area)

在JDK8以前的HotSpot虚拟机中,方法区也被称为"永久代"(JDK8已经被元空间取代)。方法区是被所有线程共享,存放的主要为以下的内容。
静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中,但是实例变量存在堆内存中,和方法区无关(static ,final,Class,常量池)

运行时常量池(方法区的一部分)

运行时常量池是方法区的一部分,存放字面量与符号引用。
字面量 : 字符串(JDK1.7后移动到堆中) 、final常量、基本数据类型的值。
符号引用 : 类和结构的完全限定名、字段的名称和描述符、方法的名称和描述符。

Java堆(线程共享)

Java堆(Java Heap)是JVM所管理的最大内存区域。Java堆是所有线程共享的一块区域,在JVM启动时创建。此内存区域存放的都是对象实例。
Java堆是垃圾回收器管理的主要区域,因此很多时候可以称之为"GC堆"。根据JVM规范规定的内容,Java堆可以处于物理上不连续的内存空间中。Java堆在主流的虚拟机中都是可扩展的(-Xmx设置最大值,-Xms设置最小值)。
如果在堆中没有足够的内存完成实例分配并且堆也无法再拓展时,将会抛出OOM,堆又可分为以下几部分:
在这里插入图片描述
在这里插入图片描述

一般新创建的对象都在

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值