这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫JVM内存模型。

1、JVM的基本结构

================

JVM启动后,对操作系统来说,JVM是一个的进程,这个进程的基本结构如上图所示。它包括:类加载器子系统、运行时数据区、执行引擎和本地方法接口。

运行时数据区是JVM从操作系统申请来的堆空间和操作系统给JVM分配的栈空间的总称。JVM为了运行Java程序,又进一步对运行时数据区进行了划分,划分为Java方法区、Java堆、Java栈、PC寄存器、本地方法栈等,这里JVM从操作系统申请来的堆空间被划分为方法区和Java堆,操作系统给JVM分配的栈空间构成Java栈。

2、从操作系统角度看JVM的内存结构

==============================

从Linux操作系统角度看,JVM是一个普通的应用程序进程,那么JVM具有一般操作系统进程的特点,一般的进程的内存结构和JVM进程的内存结构是类似的,它们的内存结构类比参见下图。

Linux把一个程序在内存中所占的空间分为:方法区、数据区、堆区、栈区,对应地,JVM在内存中也有JVM方法区、JVM数据区、堆区和栈区。

代码区  中存放应用程序的机器代码,运行过程中代码不能被修改,具有只读和固定大小的特点。

数据区  中存放了应用程序中的全局数据,静态数据和一些常量字符串等,其大小也是固定的。

堆         是运行时程序动态申请的空间,属于程序运行时直接申请、释放的内存资源。

栈区      用来存放函数的传入参数、临时变量,以及返回地址等数据。未使用区是分配新内存空间的预备区域。

由图中可以知道,JVM堆被JVM进一步分为:运行时数据区中Java的方法区和Java堆(图中显示的是:永久、新生、老年,这是分代垃圾回收时的术语,实际上永久代和Java方法区对应,新生代和老年代和Java堆对应),也就说Java方法区和Java堆其实都是JVM堆的一部分。JVM的栈区构成了Java的线程栈。

Java方法区,在分代垃圾回收时也被称为永久区,包括了已被虚拟机加载的类信息、常量池、静态变量、即时编译器编译后的代码等数据,它实际上构成了Java程序的方法区和数据区。垃圾回收器也会对这部分内存进行回收,比如常量池的清理和类的卸载。

(这里要注意区分JVM堆和Java堆,JVM方法区和Java方法区)

Java堆包括新生代和老年代,新生代包括Edge区两个Survivor区(from Survivor 和 To Survivor)。

JVM的垃圾回收器主要工作是回收Java堆中的垃圾内存,具体来说就是JVM堆中的新生代和老年代所占的内存。垃圾回收的内容主要关注这两块区域。运行Java程序之前,可以通过Xms(Java堆初始大小)和Xmx(Java堆最大值)来调整堆内存。

关于JVM的垃圾回收器的工作过程,和它回收垃圾内存时所遵循的策略也即垃圾回收算法,可以单独写一篇文章总结,这里不再写。

3、JVM的类加载子系统

===================

JVM的类加载子系统主要用来加载和卸载Java类,其工作过程对应于一个类在内存中的生命周期,一般可以分为:加载、连接(验证、准备、解析)、初始化、使用类和卸载类。

这个子系统的每一个阶段的工作内容可以单独总结为一篇文章,比如类的加载和类加载器,目前不在这里多写。

4、执行引擎

=============

执行引擎是JVM执行Java字节码的核心,执行方式主要分为:解释执行、编译执行、自适应优化执行、硬件芯片执行等方式。关于执行引擎也可以单独总结。

JVM的基本结构和JVM的内存结构的更多相关文章

  1. Jvm原理剖析与调优之内存结构

    一些不得不说的概念 JVM JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个 ...

  2. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  3. 深入探究JVM之内存结构及字符串常量池

    前言 Java作为一种平台无关性的语言,其主要依靠于Java虚拟机--JVM,我们写好的代码会被编译成class文件,再由JVM进行加载.解析.执行,而JVM有统一的规范,所以我们不需要像C++那样需 ...

  4. jvm系列(二):JVM内存结构

    JVM内存结构 所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能 ...

  5. JVM之内存结构

    JVM是按照运行时数据的存储结构来划分内存结构的.JVM在运行Java程序时,将他们划分成不同格式的数据,分别存储在不同的区域,这些数据就是运行时数据.运行时数据区域包括堆,方法区,运行时常量池,程序 ...

  6. 浅析JVM内存结构和6大区域(转)举例非常好

    内存作为系统中重要的资源,对于系统稳定运行和高效运行起到了关键的作用,Java和C之类的语言不同,不需要开发人员来分配内存和回收内存,而是由JVM来管理对象内存的分配以及对象内存的回收(又称为垃圾回收 ...

  7. JVM内存结构、垃圾回收那点事

    翻看电脑的文件夹,无意看到了9月份在公司做的一次分享,浏览了一下"婆婆特",发现自己在ppt上的写的引导性问题自己也不能确切的回答出来,哎,知识这东西,平时不常用的没些日子就生疏了 ...

  8. JAVA常见错误处理方法 和 JVM内存结构

    OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...

  9. Java中的OutOfMemoryError的各种情况及解决和JVM内存结构

    在JVM中内存一共有3种:Heap(堆内存),Non-Heap(非堆内存) [3]和Native(本地内存). [1] 堆内存是运行时分配所有类实例和数组的一块内存区域.非堆内存包含方法区和JVM内部 ...

  10. JVM内存结构之三--持久代

    本文会介绍一些JVM内存结构的基本概念,然后很快会讲到持久代,来看下Java SE 8发布后它究竟到哪去了. 基础知识 JVM只不过是运行在你系统上的另一个进程而已,这一切的魔法始于一个java命令. ...

随机推荐

  1. pkusc2019游记

    Day0 早上 6:55 的高铁,6 点就起了,好困呜呜呜 去的路上跟 memset0 坐一起,突然发现雀魂还没停服,先雀了一局(居然拿了个 1 位还飞了一个人),与此同时 memset0 切了一道毒 ...

  2. eslint Cannot read property 'range' of null错误

    eslint Cannot read property 'range' of null错误   手动添加的配置,2个项目OK,还个项目 运行报错 Cannot read property 'range ...

  3. Mysql8.0 创建远程登陆账户

    mysql8和原来的版本有点不一样,8的安全级别更高,所以在创建远程连接用户的时候, 不能用原来的命令(同时创建用户和赋权): mysql>grant all PRIVILEGES on *.* ...

  4. 小说美句摘抄&&动漫壁纸

    不知道为啥脑子一抽打算开个坑(反正咱是个不务正业的人) 大部分是网文里的,某些是轻小说里的,文学名著--咱也不像会看那个的人啊-- upd 2019.11.6:把一些自己觉得好的动漫壁纸贴一贴,图床用 ...

  5. ES6基础-变量的解构赋值

    作者 | Jeskson 来源 | 达达前端小酒馆 解构赋值: 数组的解构赋值,对象的解构赋值,字符串的解构赋值,数值与布尔值的解构赋值,函数参数的解构赋值. 开发环境准备: 编辑器,VS Code, ...

  6. HDU 6212 Zuma

    Zuma 这个题没有素质!它卡常! 我发现网上很多人的题解都写得很奇怪,也不好确定正确性,所以我借这篇题解表达一下愚见 定义$ dp[i][j][0...4]$表示 0:消完了 1:还剩1个0 2:还 ...

  7. DNS基本操作详解

    在很多人看来,DNS只是为外部提供DNS解析服务(我以前也是这么认为的,直到膝盖中了一箭),但作为互联网的基础设施,DNS远没有想象的那么简单.如果你没有听说过DNS查询.反向解析.zone传输.动态 ...

  8. SpringMVC(十五):Dispatcher的重要组件之一MultipartResolver(StandardServletMultipartResolver和CommonsMultipartResolver)的用法

    MultipartResolver组件 从Spring官网上可以看到MultipartResolver接口的定义信息: public interface MultipartResolver A str ...

  9. 自动创建Kibana索引

    参考 https://www.cnblogs.com/dance-walter/p/10471950.html 参考 https://www.elastic.co/guide/en/kibana/cu ...

  10. android为什么不允许新开启一个线程来更新UI,而是用handler来更新界面

    下面是快速创建一个新线程的方法: 第一种:直接创建子线程并启动      new Thread() {@Overridepublic void run() {     //这里写入子线程需要做的工作  ...