JVM内存分析
1.java内存模型分析
java虚拟机运行时数据存储区域包括线程隔离和线程共享两类,整个PC的内存图如下所示:

下面对以上内存区域说明:
1.1 register和cache
当代计算机一般有多个cpu,每个cpu有独立的寄存器用于运行时存储数据,同时每个cpu一般还会有1级或者多级高速存储的缓存,当cpu读取数据时,总是会先从缓存中读取,如果缓存中没有时才会读取主内存中的数据,先把数据加载到缓存中,然后再从缓存中读取数据;cpu写数据时,也总是会先写到缓存中,然后再某一个时间点刷新缓存,将缓存中的数据写入到主内存中。由于这种工作方式,当多线程并发执行时候,可能会出现线程间数据不可见,以及访问共享资源时会出现冲突的问题。详细介绍参考:
2.线程隔离内存区域-programmer counter
每个线程都有一个程序计数器,当执行java方法的时候,次计数器的作用是用来保存次线程下一个需要执行的指令的地址。当执行navtive方法的时候,此计数器为undifined,下一条执行由本地程序计数器管理
3.JVM stack
每个线程都有一个虚拟机栈,此内存区域在线程创建的时候分配,此虚拟机栈用于调用方法,并执行方法的计算机指令,虚拟机栈可以动态分配,也可以指定初始化大小。
此块内存区域会抛出以下两种异常:
1.StackOverflowError,当计算时候请求的内存大小大于允许的最大值。
2.OutOfMemoryError,当动态分配内存的时候,已经没有可用内存非配给新建的线程时候会抛出此异常。
4.堆
堆内存是所有线程共享的内存区域,此内存区域在虚拟机启动的时候就由虚拟机进行分配,堆内存的大小可以固定大小,也可以动态分配,实现方式由具体的jvm来决定。我们所有使用new关键字创建的对象实例都保存在此内存区域内,此内存区域也是垃圾回收的主要区域。此内存区域会抛出以下异常:
OutOfMemoryError:当没有空间分配给新建的对象实例的时候会抛出此异常。
5.方法区
方法区在逻辑上是数据堆的一部分,同样是所有线程共享的内存区域,在虚拟机启动的时候分配此内存,主要用于保存所有的类文件,包括类文件中的常量池、类方法、构造方法、类变量等数据。类加载的时候,会将这些信息保存到此内存区域。此内存区域由可能抛出以下异常:
OutOfMemoryError:当没有可用内存空间分配给新的类信息时候,会抛出此异常。
6.运行时常量池
运行时常量池是用于保存类文件或者接口文件中的常量表中的数据,此数据包括编译时可知的字面值常量和运行时需要解析的方法引用和Object变量引用等。此内存区域由方法区分配,在虚拟机加载类的时候会为每个类分配一个对应的类属常量池。此内存区域会抛出以下异常:OutOfMemoryError,当没有可用内存分配给内存申请的时候会抛出此异常。具体内存分配信息参考:
JVM内存分析的更多相关文章
- 大数据学习--day13(字符串String--源码分析--JVM内存分析)
字符串String--源码分析--JVM内存分析 String 类的对象 , 是不可变的字符串对象呢 这个不可变很重要,之后要讲的intern()也离不开它的不可变性. https://www.cnb ...
- 学习记录--JVM内存分析
今天刷牛客网的题时,看到了两位大神关于JVM内存分析的讲解,就顺手记录学习一下. JVM内存模型图 方法区域存放了所加载的类的信息(名称.修饰符等).类中的静态变量.类中定义为final类型的常量.类 ...
- Day05_22_实例化对象的JVM内存分析
创建对象的 JVM 内存分析 *new 运算符的作用是创建对象,在JVM堆内存中开辟新的内存空间 *方法区内存:在类加载的时候,class字节码文件被加载到该内存空间当中 *栈内存(局部变量):方法代 ...
- 利用MAT玩转JVM内存分析(一)
本文首发于公众号:javaadu 尽管JVM提供了自动内存管理的机制,试图降低程序员的开发门槛,确实也实现了这一目标,在日常开发中,我们一般都不需要关心对象的内存释放.JVM大部分都是使用trace算 ...
- 说下Java堆空间结构,及常用的jvm内存分析命令和工具
Java堆空间结构图:http://www.cnblogs.com/SaraMoring/p/5713732.html JVM内存状况查看方法和分析工具: http://blog.csdn.net/n ...
- JVM堆空间结构及常用的jvm内存分析命令和工具
jdk8之前的运行时数据区域 程序计数器 是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器.每个线程都有一个独立的程序计数器,这类内存区域为"线程私有",此内存 ...
- JVM 内存分析
简述JVM垃圾回收机制 垃圾回收机制时Java提供的自动释放内存空间的机制. 垃圾回收机制时JVM自导的一个线程,用于回收没有被引用的对象. JVM有一个运行时的数据区来管理内存.其主要包括五大部分: ...
- JVM内存分析工具MAT使用
1. 首先去官网下载MAT软件,路径如下: 点击打开链接 2. 将heap dump文件打开即可分析.
- 配置JVM内存 查看内存工具
一.配置JVM内存 1.配置JVM内存的參数有四个: -XmxJavaHeap最大值.默认值为物理内存的1/4.最佳设值应该视物理内存大小及计算机内其它内存开销而定. -XmsJavaHeap初始值, ...
随机推荐
- 【转】PE详解
参考网址: http://blog.tianya.cn/listcate-4259222-2269876-1.shtml PE文件
- Vs Code JavaScript开发插件推荐
1 vscode-icons 使用效果 安装好后如何设置? Ctrl+Shift+P 然后输入theme 2 document this 如何使用? 在方法或者要注释的地方上 按 快捷键 Ctrl + ...
- Selenium_WebDriver_控制浏览器
版权声明:本文为博主原创文章,转载请注明出处. 浏览器环境: ①GoogleChrome:60 ②chromedriver:2.30: 访问 操作 方法 示例 访问页面 void get(java. ...
- 微信小程序中不同页面间的参数传递
从样式页面WXML向逻辑页面JS传递点击事件的响应函数中传递参数 <!--此为样式页面--> <block wx:for="{{postList}}" wx:fo ...
- 携程Apollo(阿波罗)配置中心在.NET Core项目快速集成
.NET Core的支持文档大体上可以参考文档.Net客户端使用指南:https://github.com/ctripcorp/apollo/wiki/.Net%E5%AE%A2%E6%88%B7%E ...
- “茴”字有四种写法,this也是一样
说到这个地方又想起以前高中还是初中学的<孔乙己>这个梗,但是这里的this显然实用性比那个要大很多,哈哈. 简单来说,this有四种应用场景,分别是在构造函数上.对象属性中.普通函数中.c ...
- Mac 上安装 GCC
https://www.zhihu.com/question/20588567 安装 添加bin路径到$PATH变量
- git服务器配置http请求
使用apache 配置http协议的git库 在CentOS上基于Apache http服务搭建git远程仓库(一) 基于http方式的git服务器搭建 搭建http协议的git服务器 Linux g ...
- 【国家集训队2010】小Z的袜子[莫队算法]
[莫队算法][国家集训队2010]小Z的袜子 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程, ...
- 新手最纠结的事。学什么语言最好?学什么语言有前途(or 钱途)?
这篇文章是转载自王根的博客,源地址:http://www.yinwang.org/blog-cn/2017/07/06/master-pl ,虽然王根是一个备受争议的人,不过这篇文章写的很好,我对于编 ...