在Java进阶知识的学习中,JVM都是避不过去的一关,我个人对于JVM的理解其实就是相当于在操作系统的外层再加了一层中间层,从来屏蔽了具体硬件之间的不同实现,使得Java实现了最重要的特性:一次编译,处处运行。本分类中的内容都是基于《深入理解Java虚拟机》中的内容以及网络上面博客整理,外加自己的理解。

今天的内容是JVM中的基础:JVM内存模型

JVM内存模型

JVM中的内存模型主要分为五大块:程序计数器,虚拟机栈,本地方法栈,堆,方法区



其中,方法区与堆是所有线程共享使用的区域,而虚拟机栈、本地方法栈、程序计数器则是线程内共享的区域。

  • 方法区中存放是常量、数据类型、字节码动态生成的代码等数据
  • 堆中存放的是对象等数据
  • 程序计数器中存放的是线程执行到哪一步的计数器,它也是《Java虚拟机规范》中唯一一个没有内存溢出错误的区域
  • 虚拟机栈中存放了局部变量表等数据,主要是保存方法执行的中间变量
  • 本地方法栈的职能与虚拟机栈类似,所以有些JVM将虚拟机栈与本地方法栈合并起来一起处理

方法区

在jdk8之前,方法区使用永久代实现,永久代主要是为了避免单独写一个内存管理;而在jdk8之后抛弃了永久代的相关概念,而是改用元空间来存储。

方法区中主要是存储数据类型、常量等数据;在jdk8之前,使用永久代实现方法区,永久代相当于是利用JVM自己的内存开辟了一个区域,所以导致JVM更容易OOM;而在jdk8之后,则全面替换成了元空间,元空间使用本地内存进行实现。

方法区中的分布:

运行时常量池

首先需要区分常量池和运行时常量池这两个概念;

  • 运行时常量池是方法区的一部分,其中存放着常量。
  • 常量池一般指的是Class文件中的常量池表,在之后会介绍相关内容,这里先一笔带过。

运行时常量池是一个动态性的内存区域,开发人员可以动态性的往其中加入常量,其中最常见的便是String类的intern()方法。如果常量过多,那么便会爆OOM异常。

Java堆

Java堆的用处便是存放对象实例,JVM中基本上所有的对象实例都是存放于Java堆中,如果对象创建过多并且没有足够内存,则直接爆OOM异常。

程序计数器

相当于记录线程当前执行的位置的相关信息

Java虚拟机栈

我们都知道,Java方法会创建一个栈来执行,指的就是Java虚拟机栈,描述的是Java方法执行的线程内存模型。每个方法被执行的时候,Java虚拟机栈会同步创建一个栈帧存储局部变量表、操作数栈、动态连接、方法出口等信息,栈帧对应其方法从入栈到出栈的过程。

本地方法栈

本地方法栈跟Java虚拟机栈类似,所以有些JVM将其余Java虚拟机栈内存区域合并。其主要是为本地(Native)方法服务

JVM基础学习(一):JVM内存模型的更多相关文章

  1. JVM基础(1)——内存模型

    转载:http://blog.csdn.net/weitry/article/details/53264262 系列文章规划: JVM基础(1)——内存模型 JVM基础(2)——内存管理 JVM基础( ...

  2. JVM 系列(二)内存模型

    02 JVM 系列(二)内存模型 一.JVM 内存区域 JVM 会将 Java 进程所管理的内存划分为若干不同的数据区域.这些区域有各自的用途.创建/销毁时间: 一. 线程私有区域 线程私有数据区域生 ...

  3. 【CUDA 基础】4.1 内存模型概述

    title: [CUDA 基础]4.1 内存模型概述 categories: - CUDA - Freshman tags: - CUDA内存模型 - CUDA内存层次结构 - 寄存器 - 共享内存 ...

  4. JVM学习总结一——内存模型

    JVM是java知识体系的基石之一,任何一个java程序的运行,都要借助于他.或许对于我这种初级程序员而言,工作中很少有必要刻意去关注JVM,然而如果能对这块知识有所了解,就能够更清晰的明白程序的运行 ...

  5. JVM基础学习(二):内存分配策略与垃圾收集技术

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来 垃圾收集概述 Java内存模型中的堆和方法区是垃圾收集技术所需要关注的终点,因为其他的区域会跟 ...

  6. JVM学习记录-Java内存模型(一)

    前言 Java虚拟机规范中定义了一种Java的内存模型,即Java Memoory Model(简称JMM),用来实现让Java程序在各个平台下都能达到一致的内存访问效果.JVM是整个虚拟机,JMM模 ...

  7. JVM学习记录-Java内存模型(二)

    对于volatile型变量的特殊规则 关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制. 在处理多线程数据竞争问题时,不仅仅是可以使用synchronized关键字来实现,使用vo ...

  8. 深入理解JVM(③)学习Java的内存模型

    前言 Java内存模型(Java Memory Model)用来屏蔽各种硬件和操作系统的内存访问差异,这使得Java能够变得非常灵活而不用考虑各系统间的兼容性等问题.定义Java内存模型并非一件容易的 ...

  9. JVM(一)Java内存模型

    前言 对于从事C.C++程序开发的开发人员来说,在开始使用对象之前,他们都需要使用new关键字为对象申请内存空间,在使用完对象之后,也需要使用delete关键字来释放对象占用的内存空间.对于Java程 ...

随机推荐

  1. JavaScript的执行过程(深入执行上下文、GO、AO、VO和VE等概念)

    JavaScript的执行过程 前言 编写一段JavaScript代码,它是如何执行的呢?简单来说,JS引擎在执行JavaScript代码的过程中需要先解析再执行.那么在解析阶段JS引擎又会进行哪些操 ...

  2. Flowable实战(一)启动第一个完整流程

    一.前言:   发现网上关于Flowable的资料基本都是浅尝辄止,对如何构建一个企业级的流程应用说明很少,所以写个实战系列,希望对大家和自己,都有所帮助. 二.认识Flowable   Flowab ...

  3. linux与shell介绍 - 进程与线程

    linux linux与windows的区别 linux的文件结构 Linux基本命令 ls: 列出目录 cd: 切换目录 pwd: 显示当前目录 mkdir: 创建一个新的目录 rmdir: 删除一 ...

  4. 触发器中获取sql

    CREATE trigger 触发器名 on 表名 for update,delete as set nocount on create table #t(EvebtType varchar(60), ...

  5. Cesium1.70-介绍CesiumOSM建筑新特性

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 我们很高兴宣布Cesium OSM建筑,一个覆盖整个世界的3D建 ...

  6. Servlet Session的使用

    Session 是服务器端会话技术.当浏览器访问 Web 服务器的资源时,服务器可以为每个用户浏览器创建一个 Session 对象,每个浏览器独占一个 Session 对象.由于每个浏览器独占一个 S ...

  7. Typora破解

    Typora破解 需要python环境,没有的话需要先安装一下 访问 https://github.com/Mas0nShi/typoraCracker.git下载下来破解需要的压缩包并且解压缩 或者 ...

  8. python变量系列--1

    所以这里需要注意变量的使用,print(message),直接去引用,和shell略有不同 1.变量名只能包含字母,数字,下划线,但不能以数字开头 2.变量名不能含有空格

  9. 使用 MVVM Toolkit Source Generators

    关于 MVVM Toolkit 最近 .NET Community Toolkit 发布了 8.0.0 preview1,它包含了从 Windows Community Toolkit 迁移过来的以下 ...

  10. JVM内存模型(五)

    一.JVM内存模型 1.1.与运行时数据区     前面讲过了运行时数据区那接下来我们聊下内存模型,JVM的内存模型指的是方法区和堆:在很多情况下网上讲解会把内存模型和运行时数据区认为是一个东西,这是 ...