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程 ...
随机推荐
- 学习javaScript必知必会(3)~数组(数组创建,for...in遍历,辅助函数,高级函数filter、map、reduce)
一.数组: 1.js是弱语言,js中的数组定义时:不用指定数据类型.不用功指定数组长度:数组可以存储任何数据类型的数据 2.数组定义的[ ] 的实质: [] = new Array(); {} = n ...
- 01-JS中字面量与变量
01-JS中字面量与变量 一.直接量(字面量) 字面量:英语叫做literals,也做直接量,看见什么,它就是什么. (一)数字的字面量 数字的字面量,就是这个数字自己,并不需要任何的符号来界定这个数 ...
- Java对象内存模型
2 Java对象内存模型 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 在 JVM ...
- VirtualBox 安装 Ubuntu 20.04 全流程
VirtualBox 安装 Ubuntu 20.04 全流程 内容概要 这个作业属于哪个课程 2022面向对象程序设计 这个作业要求在哪里 2022面向对象程序设计寒假作业1 这个作业的目标 在虚拟机 ...
- Java类与对象的创建
以类的方式组织代码,以对象的方式组织(封装)数据 组织代码(类) public class Demo04 { String name;//默认值null int age;//默认值0 public v ...
- Spring 官宣发布 Spring Boot 3.0 第一个里程碑 M1,从 Java 8 提升到 Java 17!
Spring官方于2022年1月20日发布Spring Boot 3.0.0-M1版本,预示开启了Spring Boot 3.0的里程碑,相信这是通往下一代Spring框架的激动人心的旅程. 接下来一 ...
- 34.AVL树
1.创建Node结点 class Node { int value; Node left; Node right; public Node(int value) { this.value = valu ...
- 由浅入深,66条JavaScript面试知识点
前言 我只想面个CV工程师,面试官偏偏让我挑战造火箭工程师,加上今年这个情况更是前后两男,但再难苟且的生活还要继续,饭碗还是要继续找的.在最近的面试中我一直在总结,每次面试回来也都会复盘,下面是我这几 ...
- l线程池抓取lianjia
1. 线程池 的应用 from multiprocessing.dummy import Pool import requests from lxml import etree url="h ...
- springboot 配置mybatis 配置mapper.xml
# 插件 进行配置 也可以用yml # 1. 配置 Tomcat 修改端口号 server.port=8848 server.context-path=/zxf #2.配置数据源 spring.dat ...