【JVM】运行时内存分配
程序计数器
用于标识线程执行到了字节码文件(class文件)的哪一行,当执行native方法时,值为undefined,各个线程私有
Java虚拟机栈
每个线程独有,每个方法执行时会创建一个栈帧,用于存储局部变量表等方法信息,即方法的执行会伴随着一个栈帧的入栈出栈。
栈帧的组成

如果线程请求的栈深度大于虚拟机允许的最大深度,将抛出StackoverflowError异常
栈最大深度由栈内存大小和局部变量表大小确定,即栈大小固定,局部变量表越大,栈深度越小,栈大小可通过-Xss参数设置,默认为1m
如果栈动态扩展失败,会抛出OutOfMemoryError异常,不过hotspot虚拟机不支持栈动态扩展,申请时失败了,会抛出OOM异常
本地方法栈
虚拟机执行native方法时使用,与Java虚拟机栈类似,hotspot将二者合在一起
Java堆
用于存储Java实例对象,垃圾收集器管理的内存区域,也称为GC堆(Garbage Collected Heap)。垃圾收集就发生在该区域,一般分为eden,servivor1,servivor2,old。
另外在Java8之前还有一个永久代,不过永久代实际上不属于堆内存,属于虚拟机内存,同时受垃圾收集器管理(fullgc时触发垃圾回收)。Java8之后删除了永久代,将方法区移动至元空间(Metaspace),使用native内存,移除虚拟机,防止OOM异常,元空间大小可以通过 -XX:MaxMetaspaceSize参数控制,fullgc时会对元空间进行垃圾回收;将字符串常量(JDK 7)迁移到Java堆中。
Java堆所有线程共享,不过可以通过设置TLAB(ThreadLocalAllocationBuffer)给各线程预留内存,提高内存分配时的效率。
Java堆可以通过-Xms和-Xmx设置初始大小和最大大小(虽然现在的项目一般将两个值设为相同以减少GC次数),当动态申请内存不足时,会抛出OOM异常。
方法区
用于存储已经被Java虚拟机加载的类型信息,常量,静态变量和即时编译器编译后的代码缓存等数据。Java8之前通过永久代实现,Java8之后通过元空间实现,实际为一个逻辑内存区域,多线程共享。Java的元空间会在fullgc时进行垃圾回收,主要进行类的卸载时方法区的垃圾回收。当内存分配出现不足时,会抛出OOM异常。
运行时常量池
属于方法区的一部分,用于存储类的版本,方法,字段,接口等描述信息,同时接受新的常量,例如String.intern()方法将字符串放入常量池中,实际将char[]存储到堆中的字符串常量池中,将引用存储到运行时常量池中。当内存不足时,抛出OOM异常。
注意,运行时常量池不等于字符串常量池,上面说了,字符传常量池在(JDK 7后移入)堆(老年代)中,而运行时常量池实际存储在元空间中
直接内存
直接内存不属于JVM虚机内存的一部分,属于native内存,JDK1.4后推出的NIO即可以直接操作Native内存,通过在Java堆中创建DirectByteBuffer对象控制Native内存。
【JVM】运行时内存分配的更多相关文章
- JVM 运行时内存结构
1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持久带=方法区+其他 堆=Old Space ...
- JVM运行时内存结构
原文转载自:http://my.oschina.net/sunchp/blog/369707 1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持 ...
- JVM运行时内存组成分为一些线程私
JVM运行时内存组成分为一些线程私有的,其他的是线程共享的. 线程私有 程序计数器:当前线程所执行的字节码的行号指示器. Java虚拟机栈:java方法执行的内存模型,每个方法被执行时都会创建一个栈帧 ...
- [转]JVM运行时内存结构
[转]http://www.cnblogs.com/dolphin0520/p/3783345.html 目录[-] 1.为什么会有年轻代 2.年轻代中的GC 3.一个对象的这一辈子 4.有关年轻代的 ...
- java程序运行时内存分配详解
java程序运行时内存分配详解 这篇文章主要介绍了java程序运行时内存分配详解 ,需要的朋友可以参考下 一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个 ...
- JVM02——JVM运行时内存
在上一篇文章中,我们介绍了 JVM 的内存区域,本文我们将继续围绕 JVM 展开话题,介绍 JVM 运行时内存.关注我的公众号「Java面典」了解更多 Java 相关知识点. Java 堆从 GC 的 ...
- 基础篇:JVM运行时内存布局
目录 1 JVM的内存区域布局 2 JVM五大数据区域介绍 3 JVM运行时内存布局和JMM内存模型区别 4 JMM内存模型交互操作 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 JVM的内存 ...
- 详细了解JVM运行时内存
详细了解JVM运行时内存 1.程序计数器 概念 程序计数器也叫作PC寄存器,是一块很小的内存区域,可以看做是当前线程执行的字节码的行号指示器.字节码的解释工作就是通过改变程序计数器里面的值来获得下一条 ...
- JVM运行时内存区
JVM运行时内存区是如何划分的? 方法区(Method Area):存储类的字节码信息.常量池 堆区(Heap Area):存储对象 Java方法栈(Stack Area):所有方法运行时,会创建一 ...
- Jvm运行时内存解析
一.jvm的概念 在了解jvm的概念之前,我们先来了解java平台的逻辑结构,图片来自<深入java虚拟机> 从图中我们可以看到jdk包含了jre,java语言和java开发工具和Api, ...
随机推荐
- Hyper-V CentOS Linux 硬盘扩容
同一物理盘进行扩容(非挂载),首先在虚机内将硬盘空间扩大, Hyper-V 需要将检查点删除 查看物理卷和卷组,并将物理卷加入到卷组 #将剩余空间添加到逻辑卷 /dev/centos/root lve ...
- Java 时间戳和时间相互转换 日期时间和字符串相互转换 日期时间相减差值 日期时间增加指定天数
Java 时间戳和时间相互转换 日期时间和字符串相互转换 日期时间相减差值 日期时间增加指定天数 代码: package com.sux.demo; import java.text.ParseExc ...
- VMware Workstation centos7 虚拟机桥接方式联网,获取动态IP
在VMware中安装 Centos7 虚拟机,日常需要带着电脑外出.因此在远程连接虚拟机时,就要求与宿主机在同一网段.在不修改路由器的情况下,让宿主与centos7都动态从路由器获取IP地址,就能解决 ...
- OAuth2.0回调函数用html页面转发给controller
OAuth2.0授权中有个回调函数,就是请求授权服务后,它会将你需要的code(假设code就是你需要的数据)发送给你的回调函数(你对外开放的一个url地址用以接收参数) 注:这个回调函数有点讨厌为什 ...
- vue学习笔记 十二、通过计算属性获取定义的状态数据
系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...
- echarts网络拓扑图动态流程图
https://aixiaodou.blog.csdn.net/article/details/93712083?utm_medium=distribute.pc_relevant.none-task ...
- Invalid options object. Sass Loader has been initialized using an options obj
https://blog.csdn.net/liwan09/article/details/106981239
- ES5新增语法
ES5中给我们新增了一些方法,可以很方便的操作数组或者字符串,这些方法主要包括:数组方法.字符串方法.对象方法. 1. 数组方法 迭代(遍历)方法:forEach() .map().filter(). ...
- 堆和栈:JS数据怎么存储的?
JS数据存储主要分堆和栈两种, 栈空间:通常情况栈空间不会设置太大,主要用来存放一些原始类型的小数据,原始类型的数据有:Boolean.Null.Undefined.Number.BigInt.Str ...
- confiparse遇到特殊字符的解析处理
一.背景:confiparse类解析mysql密码时发现包含特殊字符时出现报错的情况:配置文件如下: 代码如下: import configparser import os #读取配置 conf=co ...