jvm内存区域
概述
jvm内存分为几个区域:
- 程序计数器
- 虚拟机栈
- 本地方法栈
- 堆
- 方法区
- 运行时常量池
直接内存
这些内存区域是在java进程中细分的,为java程序提供服务
不同的区域存储的内容不一样,生命周期的也不一样内存区域
程序计数器
这个就跟处理器中的程序计数器的功能差不多,是记录下一条字节码的地址
不过处理器的程序计数器是为进程服务的,jvm中的程序计数器是为线程服务的
所以jvm的程序计数器是线程私有的,声明周期和线程相同,各线程之间的程序计数器互不干扰
因为是记录下一条字节码的地址,所以不对java中native方法服务,native方法会直接开启一个进程,由cpu中的程序计数器来控制
程序计数器是jvm中唯一不会抛出OutOfmemoryError的区域虚拟机栈
这个也跟cpu中的栈的作用差不多,进入方法时,在栈中入栈一个栈帧,栈帧中记录着局部变量表、操作数栈、动态链接、方法出口。当退出这个方法时,出栈当前栈帧
虚拟机栈因为面向方法服务,所以他是线程私有的局部变量表
局部变量表中记录着方法中的局部变量的类型(如int,boolean,char,...,引用类型)和这个变量的内存地址
操作数栈
操作数栈相当于cpu中的通用寄存器,存放着被逻辑运算单元处理的值,很多指令都需要从这个区域读取值(add,cmp,mov,...)
方法出口
这里记录着处理完当前方法之后,执行的下一条指令的地址
本地方法栈
本地方法栈其实跟虚拟机栈差不多,只不过是面向native方法服务,虚拟机栈只对字节码服务
堆
这个区域是绝大多数对象生活的地方。自然也是垃圾收集器的重点照顾对象。
该区域负责存储对象的实例,在这里进行对象的内存空间的分配。因为绝大多数对象都生活在这里,所以他是所有线程共享的区域。
堆还细分为新生代区域和老生代区域。新生代区域主要存活的是“朝生夕死”的对象,频繁的出生,又频繁的被消灭,这是被垃圾收集器集火的区域。老生代区域存活的需要稳定存活的对象,所以垃圾收集器比较少光顾这里。
绝大多数对象是存活时间较短的,既生活在新生代。所以新生代区域通常比老生代区域要大。方法区
方法区记录着已加载类的信息。如全限定名(包名+类名)、方法、字段、描述符、参数、常量、静态变量。此区域也是被所有线程共享。
这个区域还有一个名称——永生代,意味着这个区域很少被清理。因为类的可清理幅度很小,以及判断一个类是否是不再被需要的类要求比较苛刻,所以垃圾收集器很少清理这个区域。运行时常量池
这个区域记录着编译期生成的字面量和符号引用。同样也是被所有线程共享的。
字面量
字面量包括是被双引号""标明的字符串,以及在代码中写死的一些基本数据类型,这些都属于常量。
在jdk1.6,运行时常量池是属于方法区的一部分。发现一个常量,首先检查运行时常量池中是否已经存放了这个常量,如果没有存放,则复制一份到运行时常量池中。以后每一次试图创建相同值的常量,都直接引用运行时常量池。
从jdk1.7开始,运行时常量池已经划分到了堆中。对于首次出现的常量,不再复制到运行时常量池,而是在运行时常量池中保留一份引用,指向首次出现常量的内存地址。直接内存
这个区域其实上不是jvm的一部分,而且属于其他进程的。当调用一个native方法的时候,就可能会产生一份直接内存。
直接内存指的是在native方法中使用的那一块内存空间。比如NIO操作,它是使用native方法来读写文件的,这时就会产生一份直接内存指向读写文件的内存(缓存)。
注意直接内存并不在jvm中,但是会在jvm堆中保持一个引用,指向内存空间的直接内存。这样就避免了类似NIO操作频繁的从内存空间和java堆中来回复制数据。
查看原
文:http://blog.zswlib.com/2016/11/05/jvm%e5%86%85%e5%ad%98%e5%8c%ba%e5%9f%9f/
jvm内存区域的更多相关文章
- JVM基础知识(1)-JVM内存区域与内存溢出
JVM基础知识(1)-JVM内存区域与内存溢出 0. 目录 什么是JVM 运行时数据区域 HotSpot虚拟机对象探秘 OutOfMemoryError异常 1. 什么是JVM 1.1. 什么是JVM ...
- JVM内存区域模型
一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代” .“非堆” ,"perm", 它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共 ...
- 初始jvm(一)---jvm内存区域与溢出
jvm内存区域与溢出 为什么学习jvm 木板原理,最短的一块板决定一个水的深度,当一个系统垃圾收集成为瓶颈的时候,那么就需要你对jvm的了解掌握. 当一个系统出现内存溢出,内存泄露的时候,因为你懂jv ...
- JVM内存区域详解
本文分为两部分:一是JVM内存区域的讲解:二是常见的内存溢出异常分析. 1.JVM内存区域 java虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途, ...
- Java虚拟机------JVM内存区域
JVM内存区域运行时数据区域分为两种: JVM内存区域 运行时数据区域分为两种: 线程隔离的数据区: 程序计数器 Java虚拟机栈 本地方法栈 所有线程程共享的数据区: Java堆 方法区 JVM 内 ...
- JVM内存区域划分及垃圾回收
第一部分.闲扯+概述 近来在研读<深入理解java虚拟机>一书,读完之后做个小结,算是记录一下自己的学习所得,在成长的路上,只能死磕. 要理解JVM,就要先从其内存区域划分开始,知道其由几 ...
- JVM 内存区域 (运行时数据区域)
JVM 内存区域 (运行时数据区域) 链接:https://www.jianshu.com/p/ec479baf4d06 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内 ...
- 走进JVM【二】理解JVM内存区域
引言 对于C++程序员,内存分配与回收的处理一直是令人头疼的问题.Java由于自身的自动内存管理机制,使得管理内存变得非常轻松,不容易出现内存泄漏,溢出的问题. 不容易不代表不会出现问题,一旦内存泄漏 ...
- JVM内存区域的划分(内存结构或者内存模型)
JVM内存区域的划分(内存结构或者内存模型) 运行时数据区域: 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 程序计数器(线程私有): 是当前线程所 ...
- 深入理解JVM内存区域与内存分配
前言:这是一篇关于JVM内存区域的文章,由网上一些有关这方面的文章和<深入理解Java虚拟机>整理而来,所以会有些类同的地方,也不能保证我自己写的比其他网上的和书本上的要好,也不可能会这样 ...
随机推荐
- Javascript高性能编程-提高Dom访问速度
在浏览器中对于Dom的操作和普通的脚本的操作处于两个不同的dll中,两个dll的交互是比较耗时的,优化对Dom的操作可以提高脚本的执行速度.下面是对如何优化的一些总结: 将需要多次操作的节点存储在一个 ...
- xss和sql注入原理学习
8.4 Web跨站脚本攻击 8.4.1 跨站脚本攻击的原理(1) 跨站脚本在英文中称为Cross-Site Scripting,缩写为CSS.但是,由于层叠样式表 (Cascading Style ...
- 在 Windows7 上按照 MySQL5.7
在 Windows7 上按照 MySQL5.7 1.从官网下载最新版本的 MySQL,这里下载的是 mysql-5.7.17-win32: 2.将下载的 mysql-5.7.17-win32.zip ...
- 关于HTML语义化的一些理解
语义化这个词我想大家都看到了无数次,特别是在一些招聘广告上. 其实我自己也是,不过每次看到都觉得是那些招聘公司复制的,其实他们根本说不清语义化是什么,而且也根本不看重. 所以我一直也没把这东西当回事过 ...
- UITableView(二)
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...
- Windows10-UWP中设备序列显示不同XAML的三种方式[3]
阅读目录: 概述 DeviceFamily-Type文件夹 DeviceFamily-Type扩展 InitializeComponent重载 结论 概述 Windows10-UWP(Universa ...
- Visual Studio 实用扩展推荐
Visual Studio 拥有非常不错的可扩展性,在之前的文章中,我也给大家示范了如何进行编辑器的扩展(详见文末参考资源).在本篇文章中,我将介绍几款非常实用的扩展,从而帮助我们提高开发效率. C# ...
- JS设计模式(二)
5.迭代器模式 先实现一个简单的迭代器,类似于JQ里的$.each方法. var each = function (arr, callback) { for (var i = 0, l = arr.l ...
- Web中的XHRHttpRequest
1.提出者:Jesse James Garrett 2.IE中,XHR是通过ActiveX对象实现的.涉及浏览器的兼容性写法. 3.使用 <1>open("请求方式&qu ...
- 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)
上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...