JVM笔记2-Java虚拟机内存管理简介
java虚拟机内存管理图如下图所示:
1.线程共享区,是所有的线程所共用的,线程共享区有一下几个组成:
1.方法区:
1.运行时常量池,已经被虚拟机加载的类信息(1.类的版本信息,2.字段,3.方法,4.接口等),常量,静态变量,即时编译器编译后的代码等数据。
2.垃圾回收器也会光顾这个区域,例如常量池。
3.HotSpot中用方法区来实现永久代。这样的做的好处就是,垃圾回收器可以像管理java堆一样管理这部分内存,省去了为方法区编写内存管理的工作,注意的是这
仅仅限于HotSpot中,其他的虚拟机并没有永久代这个概念,虚拟机规范中,永久代不等于方法区,而且没有进行详细的规范说明。用方法区实现永久代并不是一个很好的途径
HotSpot在JDK1.7中进行的改进。
2.java堆:
1.存储对象实例,可以人作为所有对象的实例存储在这里,涉及编译优化和虚拟机优化的时候有些对象实例并不存储在这里。
2.垃圾收集器管理的主要区域。
3.长时间存活的对象实例会被放入老年代去,不长期存活的会在新生代中。
4.当对空间申请完后会抛出OutOfMemory的内存溢出异常。
2.线程独占区,是每一个线程都有自己独立的虚拟机栈,本地方法栈,程序计数器。
1.虚拟机栈:存储方法运行时所需的数据,成为栈帧。
1.虚拟机栈描述的是java方法执行的动态内存模型。
2.栈帧:每个方法的执行都会创建一个栈帧,伴随着方法从创建到执行完成。用于存储局部变量表,操作数栈,动态连接,方法出口等。
3.局部变量表:
1.存放编译期可知的各种变量类型,引用类型,returnAddress类型。
2.局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的,方法运行期间不会改变局部变量表的大小。
4.大小:虚拟机栈的空间是有限的。举个例子。如下面代码:
如果运行将这段代码就会爆出如下的错误:
原因也很简单,因为递归无限调用,每一个方法对应一个栈帧,虚拟机栈中放满了栈帧,因此,就会爆出了StackOverflowError,即栈溢出异常。
假如虚拟机栈很大,又会出现什么问题呢?显然抛出OutOfMemory异常,因为如果虚拟机栈很大的话,每一个方法对应一个栈帧,疯狂申请内存。这样内存迟早会用完,因此会出现
内存溢出的异常。因此虚拟机栈有一定的大小。
2.本地方法栈:为JVM所调用到的native即本地方法服务。与虚拟机栈相似。栈帧,局部变量表,大小都接近一样。唯一不同的是:
1.虚拟机栈为虚拟机执行java方法服务。
2.本地方法栈为虚拟机执行native服务。
3.程序计数器:记录当前线程所执行到的字节码的行号。
1.程序计数器是一块较小的内存空间,它可以看作是当前线程所执行行的字节码的行号指示器。
2.程序计数器处于线程独占区,这也很好理解,如果所有的线程都共用一个程序计数器,那么程序将会乱套。
3.如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是 native方法,这个计数器的值为undefined
4.此区域是唯一 一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。这也很好理解我们在程序中并没有对计数器的操作,计数器是虚拟机中实现的,与我们开发者无关。
JVM笔记2-Java虚拟机内存管理简介的更多相关文章
- (三)java虚拟机内存管理和线程独占区和线程共享区
一.内存管理 二.线程独占区之程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节 ...
- java虚拟机内存管理
1. java虚拟机内存如下 2. 运行时数据区 内存图分析:
- 深入理解Java虚拟机—内存管理机制
前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的. 先让我们来看张图 有些文章中对线程隔离区还称之为线程独占区,其实是一个意思 ...
- Java虚拟机内存管理机制
自动内存管理机制 Java虚拟机(JVM)在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区 ...
- 深入理解java虚拟机---java虚拟机内存管理(七)
本地方法栈.java堆.方法区 本地方法栈在HotSpot版本内与java虚拟机栈是合二为一的.不单独区分本地方法栈.但是java虚拟机中是有这样一块区域的. 作用: 1.本地方法栈为虚拟机栈执行ja ...
- 探秘Java虚拟机——内存管理与垃圾回收
本文主要是基于Sun JDK 1.6 Garbage Collector(作者:毕玄)的整理与总结,原文请读者在网上搜索. 1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始 ...
- 探秘Java虚拟机——内存管理与垃圾回收(转)
本文主要是基于Sun JDK 1.6 Garbage Collector(作者:毕玄)的整理与总结,原文请读者在网上搜索. 1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始 ...
- Java虚拟机内存管理原理基础入门
Jdk:Java程序设计语言.Java虚拟机.Java API类库. Jdk是用于支持Java程序开发的最小环境. Jre:Java API类库中的Java SE API子集.Java虚拟机. Jre ...
- 深入理解java虚拟机---java虚拟机内存管理(六)
java虚拟机栈的理解 虚拟机栈就是我们所熟知的栈内存,栈内存属于线程独有的.而在栈内存中的局部变量表中存储的引用类型只是存储对象的内存地址.对象的创建在堆内存中,即对象在线程共享区中. 局部变量表: ...
随机推荐
- 定时任务schedule(quartz)
1, 简介Quartz是一个任务调度框架.核心类:Scheduler :调度器,所有Job的调度都是由它控制;JobDetail :生成Job对象的实例,存储Job对象需要的参数;Job ...
- 用powershell实现:“倩女幽魂姥姥”版《语音报警系统》
------[第一章 前言]------ win7,及以上版本中,是自带语音库的,系统自带一套女声中文库,一套女声英文库.用powershell调用,从而发音,制作报警系统.是一件太简单的事情,只需要 ...
- 【php】RBAC 管理权限
用户 角色 权限 用户:张三 角色:管理员 权限:page/index1.php 能访问的页面
- APP测试(转载)
(1) 非功能测试 app测试的一个重要方面是app的非功能需求.移动app在推出市场或进行进一步开发前,测试人员有一定的职责做该类需求的跟踪工作. 早期开发阶段要进行的第一个测试应该是实用性测试.通 ...
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](九)
前言 童鞋们,大家好 我是专注.NET开发者社区建设的实践者Rector. 首先,为自己间隔了两个星期五再更新本系列文章找个不充分的理由:Rector最近工作,家庭的各种事务所致,希望大家谅解. 本文 ...
- rabbitmq的构架和原理(三)
前面两篇博文已经将环境安装和相关配置介绍了,现在开始正式学习rabbitmq的使用了: rabbitMQ的构架 rabbitmq作为消息队列,一条消息从发布到订阅消费的完整流程为: 消息 --> ...
- JDK的下载,安装与环境的配置
JDK的全称是JavaSE Development Kit,即java开发工具包,是sun公司提供的一套用于开发java应用程序的开发包,它提供了编译.运行java程序所需的各种工具和资源,包括jav ...
- 下载vlc遭遇网络劫持
一次偶然的机遇,在公司下载"vlc播放器",下载之后安装完就变成了"搜狗手机助手".而且连续几次下载都是这样,我以为是我安装了搜狗输入法的缘故. ...
- 制作 alipay-sdk-java包到本地仓库
一.首先 搭建好maven 基础环境,本地可以运行maven 命令 从支付宝官网上下载sdk https://doc.open.alipay.com/doc2/detail?treeId=54& ...
- BZOJ 4513: [Sdoi2016]储能表 [数位DP !]
4513: [Sdoi2016]储能表 题意:求\[ \sum_{i=0}^{n-1}\sum_{j=0}^{m-1} max((i\oplus j)-k,0) \] 写出来好开心啊...虽然思路不完 ...