JVM基础学习(一):JVM内存模型
在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内存模型的更多相关文章
- JVM基础(1)——内存模型
转载:http://blog.csdn.net/weitry/article/details/53264262 系列文章规划: JVM基础(1)——内存模型 JVM基础(2)——内存管理 JVM基础( ...
- JVM 系列(二)内存模型
02 JVM 系列(二)内存模型 一.JVM 内存区域 JVM 会将 Java 进程所管理的内存划分为若干不同的数据区域.这些区域有各自的用途.创建/销毁时间: 一. 线程私有区域 线程私有数据区域生 ...
- 【CUDA 基础】4.1 内存模型概述
title: [CUDA 基础]4.1 内存模型概述 categories: - CUDA - Freshman tags: - CUDA内存模型 - CUDA内存层次结构 - 寄存器 - 共享内存 ...
- JVM学习总结一——内存模型
JVM是java知识体系的基石之一,任何一个java程序的运行,都要借助于他.或许对于我这种初级程序员而言,工作中很少有必要刻意去关注JVM,然而如果能对这块知识有所了解,就能够更清晰的明白程序的运行 ...
- JVM基础学习(二):内存分配策略与垃圾收集技术
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来 垃圾收集概述 Java内存模型中的堆和方法区是垃圾收集技术所需要关注的终点,因为其他的区域会跟 ...
- JVM学习记录-Java内存模型(一)
前言 Java虚拟机规范中定义了一种Java的内存模型,即Java Memoory Model(简称JMM),用来实现让Java程序在各个平台下都能达到一致的内存访问效果.JVM是整个虚拟机,JMM模 ...
- JVM学习记录-Java内存模型(二)
对于volatile型变量的特殊规则 关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制. 在处理多线程数据竞争问题时,不仅仅是可以使用synchronized关键字来实现,使用vo ...
- 深入理解JVM(③)学习Java的内存模型
前言 Java内存模型(Java Memory Model)用来屏蔽各种硬件和操作系统的内存访问差异,这使得Java能够变得非常灵活而不用考虑各系统间的兼容性等问题.定义Java内存模型并非一件容易的 ...
- JVM(一)Java内存模型
前言 对于从事C.C++程序开发的开发人员来说,在开始使用对象之前,他们都需要使用new关键字为对象申请内存空间,在使用完对象之后,也需要使用delete关键字来释放对象占用的内存空间.对于Java程 ...
随机推荐
- Sentry 开发者贡献指南 - Feature Flag
功能 flag 在 Sentry 的代码库中声明. 对于自托管用户,这些标志然后通过 sentry.conf.py 进行配置. 对于 Sentry 的 SaaS 部署,Flagr 用于在生产中配置标志 ...
- 【漏洞复现】CVE-2022–21661 WordPress核心框架WP_Query SQL注入漏洞原理分析与复现
影响版本 wordpress < 5.8.3 分析 参考:https://blog.csdn.net/qq_46717339/article/details/122431779 在 5.8.3 ...
- Natasha 4.0 探索之路系列(三) 基本的动态编译
Natasha 的设计 动态编译 Roslyn 为开发者提供了动态编译的接口, 允许我们以 C# 代码来编写 Emit 或 表达式树生成的程序集, 但是完成一个编译需要诸多步骤, 用户参与的操作也很多 ...
- VUE3 之 Non-Props 属性
1. 概述 墨菲定律告诉我们:人总是容易犯错误的,无论科技发展到什么程度,无论是什么身份的人,错误总是会在不经意间发生.因此我们最好在做重要的事情时,尽量去预估所有可能发生的错误,并思考错误发生后的补 ...
- 记一次redis 基于spring实现类对同一个KEY序列化内容不同导致一次事故
我们的场景是这样的 我们对一个key:比如list.point.card:1 @Resourceprivate RedisTemplate<String, Long> redisTempl ...
- gin框架中中间件的编写与使用
概念 一个完整的系统可能包括鉴权认证.权限管理.安全检查.日志记录等多维度的系统支持. 中间件位与服务器和实际业务处理程序之间,其含义就相当于在请求和具体的业务处理逻辑之间增加某些操作,这种以额外增加 ...
- 一份尽可能全面的Go channel介绍
写在前面 针对目前网络上Go channel知识点较为分散(很难有单独的一份资料把所有知识点都囊括进来)的情况,在下斗胆站在巨人的肩膀上,总结了前辈的工作,并加入了自己的理解,形成了这篇文章.本文类似 ...
- 深入了解promise
1. Promise基础 什么是回调地狱? 当使用回调函数来进行事件处理的时候,如果嵌套多层回调函数的时候,就会出现回调地狱,例如: method1(function(err, result) { i ...
- mysql加强(6)~子查询简单介绍、子查询分类
一.子查询简单介绍 1.什么是子查询? 一个查询之中嵌套了其他的若干查询. 在使用select 语句查询时,有时候where的查询条件中的限制条件不是一个确定的值,而是一个来自于另一个查询的结果. 子 ...
- JVM专题2: JVM内存结构
合集目录 JVM专题2: JVM内存结构 Java 内存分配 JVM 内存结构 The JVM is an abstract computing machine that enables a comp ...