JVM内存结构/JVM运行时数据区,以及堆内存的划分

1、程序计数器:
程序计数器是线程私有的内存,JVM多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,当线程切换后需要恢复到正确的执
行位置(处理器)时,就是通过程序计数器来实现的。此内存区域是唯一 一个在JVM规范中没有规定任何OutOfMemoryError情况的区域。
2、Java虚拟机栈:
Java虚拟机栈也是线程私有的,它的生命周期与线程相同,Java虚拟机栈为JVM执行的Java方法(字节码)服务。每个Java方法在执行时都
会创建一个栈帧,用于存储局部变量表、操作数栈、动态链表、方法出口等信息。
局部变量表存放的是基本数据类型,对象引用和returnAddress类型。也就是说基本数据类型直接在栈中分配空间;局部变量(在方法或者
代码块中定义的变量)也在栈中分配空间,当方法执行完毕执行完毕后该空间会被JVM回收;引用数据类型,即我们new创建的对象引用,JVM
会在栈空间给这个引用分配一个地址空间(门牌号),在堆空间给该对象分配一个空间(家),栈空间的地址引用指向堆空间的对象(通过门牌
号找到家)。
在这个区域,JVM规范规定了两个异常状况:
a.如果线程请求的栈深度大于JVM所允许的深度,将抛出StackOverflowError异常;
b.如果虚拟机栈可以动态扩容(大部分JVM都可以动态扩容),如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。
3、本地方法栈:
和Java虚拟机栈作用相似,只是本地方法栈为JVM使用到的Native(本地)方法服务,它也会抛出StackOverflowError和OutOfMemoryError异常。
参考:OutOfMemoryError/OOM/内存溢出异常实例分析--虚拟机栈和本地方法栈溢出
4、Java堆:
JVM内存中最大的一块,是所有线程共享的区域,在JVM启动时创建,唯一目的就是用来存储对象实例的,也被称为GC堆,因为这是垃圾收集器
管理的主要区域。Java堆还可分为:新生代和老年代,其中新生代还可再分为:Eden:From Survivor:To Survivor = 8:1:1,有面试官会问
为什么8:1:1,可参考:垃圾收集算法——标记-清除算法、复制算法、标记-整理算法、分代收集算法 中的复制算法
通过一张图来看一下如何通过参数来控制各区域的大小

控制参数
-Xms设置堆的最小空间大小。
-Xmx设置堆的最大空间大小。
-XX:NewSize设置新生代最小空间大小。
-XX:MaxNewSize设置新生代最大空间大小。
-XX:PermSize设置永久代最小空间大小。
-XX:MaxPermSize设置永久代最大空间大小。
-Xss设置每个线程的堆栈大小。
JVM规范中规定,Java堆可以处于逻辑上连续,物理上不连续的内存空间中,就像我们的磁盘一样。如果在堆中没有内存分配给对象实例,并且
堆也无法扩展,也会抛出OutOfMemoryError异常。
参考:OutOfMemoryError/OOM/内存溢出异常实例分析--堆内存溢出
5、方法区:
和Java堆一样,是各个线程共享的内存区域,它用于存储已被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,别名叫Non-Heap(非堆)。
很多人称他为“永久代”,本质上两者并不等价,只是因为HotSpot把GC扩展到了方法区,或者说使用永久代来实现方法区而已。方法区除了和Java堆一样不需要连续
的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集。JVM规范规定,当方法区无法满足内存分配需求时,将会抛出OutOfMemoryError异常。
JVM内存结构/JVM运行时数据区,以及堆内存的划分的更多相关文章
- 【JVM第四篇--运行时数据区】堆
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.堆的概述 JVM的运行时数据区如下: 一个Java程序运行起来对应着一个进程(操 ...
- JVM系列之四:运行时数据区
1. JVM架构图 Java虚拟机主要分为五大模块:类装载器子系统.运行时数据区.执行引擎.本地方法接口和垃圾收集模块. 2. JDK1.7内存模型-运行时数据区域 根据<Java 虚拟机规范( ...
- JVM 专题十:运行时数据区(五)堆
1. 核心概述 1.1 堆概述 一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器.本地方法栈和虚拟机栈. 一个jvm实例只存在一个堆内存 ...
- 【JVM第三篇--运行时数据区】程序计数器、虚拟机栈、本地方法栈
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.运行时数据区 我们在编写Java程序时,使用JVM的流程主要如下所示: 虚拟机在 ...
- 介绍下Java内存区域(运行时数据区)
介绍下Java内存区域(运行时数据区) Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域.JDK 1.8 和之前的版本略有不同. 下图是 JDK 1.8 对JV ...
- JVM内存区域(运行时数据区)划分
前言: 我们每天都在编写Java代码,编译,执行.很多人已经知道Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文 ...
- JVM 专题十三:运行时数据区(八)直接内存
1. 直接内存 不是虚拟机运行时数据区的一部分,也不是<Java虚拟机规范>中定义的内存区域. 直接内存是Java堆外的.直接向系统申请的内存区间. 来源于NIO,通过存在堆中的Direc ...
- Jvm基础(1)-Java运行时数据区
最近在看<深入理解Java虚拟机>,里面讲到了Java运行时数据区,这是Jvm基本知识,把读书笔记记录在此.这些知识属于常识,都能查到的,如果我有理解不对的地方,还请指出. 首先把图贴上来 ...
- JVM 专题十一:运行时数据区(六)方法区
1. 栈.堆.方法区关系交互 运行时数据区结构图: 从线程共享与否的角度来看: 2. 方法区的理解 2.1 方法区在哪里? <Java虚拟机规范>中明确说明:“尽管所有的方法区在逻辑上属于 ...
- JVM 专题九:运行时数据区(四)本地方法栈
1. 本地方法栈 2. 什么是本地方法栈? Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用 本地方法栈,也是线程私有的. 允许被实现成固定或者是可动态拓展的内存大小 ...
随机推荐
- ActiveMQ的消息持久化机制
为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制. ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,无论使用哪种持久化方式 ...
- Java NIO Channel通道
原文链接:http://tutorials.jenkov.com/java-nio/channels.html Java NIO Channel通道和流非常相似,主要有以下几点区别: 通道可以读也可以 ...
- 推荐《用Python进行自然语言处理》中文翻译-NLTK配套书
NLTK配套书<用Python进行自然语言处理>(Natural Language Processing with Python)已经出版好几年了,但是国内一直没有翻译的中文版,虽然读英文 ...
- nodejs模板加载的问题
JADE模板:http://jumplink.github.io/jade2html2jade/ HTML转JADE,跟imooc上一步步来就搞定了 直接加载HTML静态资源: var express ...
- 5.两分钟让你明白app后端有啥用
app后端,也称为app后台,称呼不一样,但指的是同一个东西. 我一直都以app后端有啥用这个问题不用解释.但在网络上,有准备进行app创业的网友(是从传统行业过来的)问过这个问题,我这里就以app后 ...
- kafka实战
1. kafka介绍 1.1. 主要功能 根据官网的介绍,ApacheKafka®是一个分布式流媒体平台,它主要有3种功能: 1:It lets you publish and ...
- 如何解决python升级后yum报错
当我们yum命令的时候,会提示 "File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: ^ SyntaxEr ...
- 用beego开发服务端应用
用beego开发服务端应用 说明 Quick Start 安装 创建应用 编译运行 打包发布 代码生成 开发文档 目录结构说明 使用配置文件 beego默认参数 路由设置 路由的表述方式 直接设置路由 ...
- Golang 通用连接池库 Golang-Pool
Golang 实现的连接池 功能: * 连接池中连接类型为interface{},使得更加通用 * 链接的最大空闲时间,超时的链接将关闭丢弃,可避免空闲时链接自动失效问题 * 使用channel处理池 ...
- bzoj5248 [2018多省省队联测]一双木棋
直接hash+爆搜即可. #include <cstdio> #include <cstring> #include <iostream> #include < ...