在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. [转]webpack——CommonsChunkPlugin

    作用虽然webpack4已经出来很久了,CommonsChunkPlugin也已经舍弃了,但是还是有很多项目是通过webpack3来打包的,对CommonsChunkPlugin各个配置项的认识还是比 ...

  2. lvgl移植—Linux fbdev&evdev(基于LVGL v7)

    虽然lvgl官方提供了有关linux framebuffer操作的库函数,但是我决定自己试一下能否自己实现这部分操作 实际项目中应优先采用官方库函数,官方实现代码位于文件夹lv_drivers/dis ...

  3. 关于在Vue中使用WebScoket的随笔

    声明:请勿直接复制粘贴抄袭文章,若有需要,请规范转载,注明出处,谢谢! ---------------------------------------------------------------- ...

  4. 如何让 Hexo 在服务器稳定运行

    声明 本文地址:如何让 Hexo 在服务器稳定运行 背景 博客系统终于又搭建起来了(好一个又),但是每隔一段时间去访问自己的网站总是访问不到,去服务器查询 ps aux | grep hexo,发现 ...

  5. 《剑指offer》面试题39. 数组中出现次数超过一半的数字

    问题描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, ...

  6. leetcode 347. 前 K 个高频元素

    问题描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素.   示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums ...

  7. 为什么JavaWeb要分层

    首先bai让我们坐着时光机回到n年前的web开发.那个时候最早du都是静态的html页面,zhi后来有了数据库,有了所谓dao的动态页面,然后程序猿在编码的时候,会把所有的代码都写在页面上,包括数据库 ...

  8. 【刷题-LeetCode】164 Maximum Gap

    Maximum Gap Given an unsorted array, find the maximum difference between the successive elements in ...

  9. vue常用组件

    滚动组件:better-scroll   官网地址:https://ustbhuangyi.github.io/better-scroll/doc/zh-hans/installation.html ...

  10. from 表单上传多个文件?

    和单个上传文件基本相同,就是需要在后台控制器中,用数组来接收 jsp页面提交过来的file数据. 也分为三个部分演示. 一.jsp <%-- Created by IntelliJ IDEA. ...