JVM之体系结构概述

所有JAVA代码的运行是需要基于JAVA虚拟机之上,JAVA虚拟机就是被称为JVM,JVM全程是Java Virtual Machine(即为Java虚拟机)。

JVM核心组成

JVM主要有两个核心部分组成:

  • Class Loader:类加载器,负责把代码运行的类文件装载到JVM虚拟机上(JVM为Java的运行环境),而JVM的运行环境则是在内存当中一段用于存放数据、代码的内存空间。
  • 执行引擎:执行引擎执行的代码和要加载的数据都来自Class Loader,执行引擎将这些数据和代码加载到JVM的内存空间中。

此时JVM运行时对应内存空间的组织格式就显得特别关键

JVM运行时内存环境

JVM在运行时的内存环境组织格式如下:

在JVM中内存模型主要分为方法区虚拟机栈 or Java栈PC寄存器 or 程序计数器本地方法栈

堆主要存放对象实例,所有对象的内存都在这里分配。堆中所有的对象(对象存储的即为数据)对JVM中的所有线程都是共享的。垃圾回收主要就是作用于这里,所以堆是运维最为关注的点。

方法区

方法区主要存放堆中对应对象所支持执行的操作代码,具体来讲即为存储了对象的类型信息、字段信息、方法信息,其它信息。方法区中存储的数据对JVM中的线程来说也都是共享的。

虚拟机栈

虚拟机栈也可以称为Java栈,虚拟机栈存放了JVM中所有线程,并且线程中所用到的局部变量、操作数栈、动态连接、返回地址等,虚拟机栈中存储的线程,线程中的存储的上述信息是私有的,各线程之间为隔离状态。

PC寄存器

PC寄存器也可以称为程序计数器,每个线程都有自己专门的计数器,一块代码当中可能会有很多条指令,当这些指令执行到N条时可能系统进行了上下文的切换,此条指令要去执行其它任务,那接下来就要去执行N+1条指令等等。PC寄存器记录了线程执行的字节码的行号,在分支,循环,跳转,异常,线程恢复等都依赖这个计数器。

本地方法栈

本地方法栈为本地操作代码,主要为Java代码中调用了操作系统层面的某些库文件来完成操作。不过在写Java代码时不建议条用本地方法栈,因为调了越多的本地代码(库文件)就越繁琐,比如写Java代码本来是需要全部使用Java来实现,突然调用了本地库中的函数,如果代码是在Windows上运行,Java代码中调用的C函数恰好在Windows上不存在,则会发生错误。

本文总结

  1. 多数的JVM操作是在方法区虚拟机栈 or Java栈PC寄存器 or 程序计数器中完成的,而执行引擎则是把内存中需要加载的相关代码进行执行。
  2. 整个JAVA运行时虽然运行空间可以分为如上五个区域,但是在大多情况下堆内存空间是最大的,因为堆内存是所有创建对象的统一存放位置,也是最消耗内存空间之处,同时它也是频繁回收内存的位置。而Java代码又不需要开发自行回收内存空间,这就意味着JVM背后需要有一个线程来进行垃圾回收。这个线程我们就称它为GC线程。
  3. GC线程不停的基于某种机制去观察堆内存空间当中是否产生了垃圾,一些对象是否已经不再被使用了,如果有对象不再被使用了,GC则对这些对象占据的内存空间进行回收。
  4. 假如在堆内存中有80个对象,但是已经有50个对象不再使用了,则GC要去根据某种机制进行识别不再使用的对象对其进行回收,余下的对象可能会零散存放在内存空间中,那么GC就需要把这些零散的对象打包后放到一个连续的内存空间中。
  5. GC主要的工作区域主要在堆内存中,主要对堆内存进行垃圾回收。

本章完 下章讲解常用的GC算法







「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
JVM
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论