java虚拟机之JVM体系结构
JVM体系结构:

下面重点介绍运行时数据区域模块:

(1)java堆(Heap)
- 被所有线程共享的一块内存区域,在虚拟机启动时创建
- 用来存储对象实例
- 可以通过-Xmx和-Xms控制堆的大小
- OutOfMemoryError异常:当在堆中没有内存完成实例分配,且堆也无法再扩展时。
java堆是垃圾收集器管理的主要区域。java堆还可以细分为:新生代(New/Young)、旧生代/年老代(Old/Tenured)。持久代(Permanent)在方法区,不属于Heap。

新生代:新建的对象都由新生代分配内存。常常又被划分为Eden区和Survivor区。Eden空间不足时会把存活的对象转移到Survivor。新生代的大小可由-Xmn控制,也可用-XX:SurvivorRatio控制Eden和Survivor的比例。
旧生代:存放经过多次垃圾回收仍然存活的对象。
持久代:存放静态文件,如今Java类、方法等。持久代在方法区,对垃圾回收没有显著影响。
(2)方法区
- 线程间共享
- 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
- OutOfMemoryError异常:当方法区无法满足内存的分配需求时
运行时常量池
- 方法区的一部分
- 用于存放编译期生成的各种字面量与符号引用,如String类型常量就存放在常量池
- OutOfMemoryError异常:当常量池无法再申请到内存时
虚拟机必须要为每个被装载的类型维护一个常量池。常量池就是该类型所用常量的一个有序集合。3.3 java虚拟机栈(VM Stack)
(3)java虚拟机栈(VM Stack)
- 线程私有,生命周期与线程相同
- 存储方法的局部变量表(基本类型、对象引用)、操作数栈、动态链接、方法出口等信息。
- java方法执行的内存模型,每个方法执行的同时都会创建一个栈帧,每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
- StackOverflowError异常:当线程请求的栈深度大于虚拟机所允许的深度
- OutOfMemoryError异常:如果栈的扩展时无法申请到足够的内存
JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量、部分的返回结果以及Stack Frame。其他引用类型的对象在JVM栈上仅存放变量名和指向堆上对象实例的首地址。
(4) 本地方法栈(Native Method Stack)
与虚拟机栈相似,主要为虚拟机使用到的Native方法服务,在HotSpot虚拟机中直接把本地方法栈与虚拟机栈二合一
(5) 程序计数器(Program Counter Register)
- 当前线程所执行的字节码的行号指示器
- 当前线程私有
- 不会出现OutOfMemoryError情况
(6)直接内存(Direct Memory)
- 直接内存并不是虚拟机运行的一部分,也不是Java虚拟机规范中定义的内存区域,但是这部分内存也被频繁使用
- NIO可以使用Native函数库直接分配堆外内存,堆中的DirectByteBuffer对象作为这块内存的引用进行操作
- 大小不受Java堆大小的限制,受本机(服务器)内存限制
- OutOfMemoryError异常:系统内存不足时
总结:Java对象实例存放在堆中;常量存放在方法区的常量池;虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据放在方法区;以上区域是所有线程共享的。栈是线程私有的,存放该方法的局部变量表(基本类型、对象引用)、操作数栈、动态链接、方法出口等信息。
一个Java程序对应一个JVM,一个方法(线程)对应一个Java栈。
java虚拟机之JVM体系结构的更多相关文章
- Java虚拟机规范----JVM体系结构
一.Java平台的结构图 二.JVM与JRE.JDK关系? JVM:Java Virtual Machine(Java虚拟机),负责执行符合规范的Class文件 JRE:Java Runtime En ...
- [转帖]Java虚拟机(JVM)体系结构概述及各种性能参数优化总结
Java虚拟机(JVM)体系结构概述及各种性能参数优化总结 2014年09月11日 23:05:27 zhongwen7710 阅读数 1437 标签: JVM调优jvm 更多 个人分类: Java知 ...
- Java虚拟机(JVM)中的内存设置详解
在一些规模稍大的应用中,Java虚拟机(JVM)的内存设置尤为重要,想在项目中取得好的效率,GC(垃圾回收)的设置是第一步. PermGen space:全称是Permanent Generation ...
- java虚拟机学习-JVM调优总结-分代垃圾回收详述(9)
为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...
- java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...
- java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)
概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...
- 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载
<深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...
- Java虚拟机的内部体系结构
1.Java程序执行流程 Java程序的执行依赖于编译环境和运行环境.源码代码转变成可执行的机器代码,由下面的流程完成: Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行. ...
- 读书笔记-《深入理解Java虚拟机:JVM高级特性与最佳实践》
目录 概述 第一章: 走进Java 第二章: Java内存区域与内存溢出异常 第三章: 垃圾收集器与内存分配策略 第四章: 虚拟机性能监控与故障处理 第五章: 调优案例分析与实战 第六章: 类文件结构 ...
随机推荐
- Cookie存储在哪里
内存是临时存储,关机后信息就没了.硬盘是长久存储,不删除就一直在.内存容量决定你电脑能同时运行的程序多少,硬盘容量决定你电脑能存放多少东西. 好比内存是手,硬盘是口袋,东西可以临时放在手里,可是口袋才 ...
- vue 组件 - 函数统一调用(自定义钩子)
vue 组件继承方法 var childComponent = Vue.extend( { extends: baseComp, // 继承基础组件方法 template:template, wait ...
- 一个自己实现的Vector(只能处理基本类型数据)
一个自己实现的Vector(只能处理基本类型数据) string 类型不行 bool char* int double float long long 等基本s类型可用 使用模板类实现.底层为数组实现 ...
- C++ Primer Plus 6 笔记(1)
1-3章 1.cin.get(),在程序末尾,让窗口一直打开. 2.c++版本的math.h为cmath 3.<< 在c++中是插入运算符,在c中是左移运算符 4.&在C中既表示地 ...
- linuxshell命令学习1——用户、文件和目录操作
1.cmd(command) --help #查找这个命令相关的帮助 2.切换用户 2.1 sudo 让普通用户可以执行root命令,暂时切换到超级用户(root)用户模式 2.1.1 su 切换到 ...
- 手动搭建Vue之前奏:搭建webpack项目
手动搭建vue项目 搭建vue前首先搭建webpack项目 首先你应当安装一下npm以及nodejs 安装完成后,进行如下操作: // 创建项目根目录 mkdir some_project_name ...
- PYTHON __main__
#importby.py if __name__ =='__main__': print '>>>>>>>1' if __name__ =="imp ...
- firewalld学习-zone
原文地址:http://www.excelib.com/article/290/show firewalld默认提供了九个zone配置文件: block.xml.dmz.xml.drop.xml.ex ...
- hello程序的运行过程-从计算机系统角度
hello程序的运行过程-从计算机系统角度 1.gcc编译器驱动程序读取源程序文件hello.c,并将它翻译成一个可执行目标文件hello.翻译过程分为四个阶段:预处理阶段,编译阶段,汇编阶段,链接阶 ...
- AndroidStudio3.0打开Android Device Monitor
相信很多更新了AndroidStudio3.0的小伙伴会发现无法在工具栏的的Tools->Android->device monitor,打开DeviceMonitor. 今天偶然看到 G ...