浅析JVM内存区域及垃圾回收
一、JVM简介
JVM,全称Java Virtual Machine,即Java虚拟机。以Java作为编程语言所编写的应用程序都是运行在JVM上的。JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java有个非常重要的特点就是与平台的无关性,而JVM正是实现这一特点的关键。
JVM对程序的执行主要分为两个步骤,第一步是编译,即将.java的源文件编译成为.class的字节码文件,第二步是解释,JVM对字节码文件进行解释执行。两个步骤流程图分别如下两图所示:
二、JVM内存区域
JVM整个大系统又分为两个子系统。第一个是ClassLoader,即类加载器,功能是将编写的类加载到JVM中。第二个是Execution Engine,即执行引擎,负责对编译后的字节码文件进行解释执行。上述中Execution Engine又分为两部分,第一部分是Runtime data area,即运行时数据区域,即相当于JVM中的内存,第二部分是Native interface,即本地化接口,主要用于执行其他非Java编程语言编写的程序。
重点就是前者Runtime data area,它分为五个部分,分别是Method area(方法区),Heap(堆),VM stack(虚拟机栈),Program counter register(程序计数器),Native method stack(本地方法栈)。前两者线程共享,后三者线程隔离。如下图所示:
概括地说,JVM初始运行的时候都会分配好Method area(方法区)和Heap(堆),而JVM 每遇到一个线程,就为其分配Program counter register(程序计数器)、VM stack(虚拟机栈)、Native method stack(本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为什么把数据区域分为线程共享和线程隔离的原因,线程隔离的那三个区域的生命周期与所属线程相同,而线程共享的区域与Java程序运行的生命周期相同,所以这也是系统垃圾回收场所只发生在线程共享的区域(实际上对大部分虚拟机来说是发生在Heap上)的原因。关于内存溢出异常如下图所示:
1、Method area(方法区)
方法区包括常量池与静态域。存放了所加载类的信息(名称、修饰符等)、类的静态变量、类的常量、类的Field信息、类的方法信息。当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区。
2、Heap(堆)
堆是JVM所管理的内存中最大的一块,几乎所有的对象实例和数组都在此区域,可以认为Java中所有通过new创建的对象的内存都在此分配,堆中的对象的内存需要等待GC进行回收。
3、Program counter register(程序计数器)
程序计数器是一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,字节码解释器工作时通过改变该计数器的值来选择下一条需要执行的字节码指令,分支、跳转、循环等基础功能都要依赖它来实现。
4、VM stack(虚拟机栈)
虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行时都会创建一个栈帧(Stack Frame),栈帧用于存储局部变量表(基本数据类型、对象的引用等)、操作数栈、动态链接、方法返回地址和一些额外的附加信息。
5、Native method stack(本地方法栈)
该区域与虚拟机栈所发挥的作用非常相似,只是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为使用到的本地操作系统(Native)方法服务。
三、JVM垃圾回收
JVM的GenerationalCollecting(垃圾回收)原理是把对象分为年青代(Young)、年老代(Tenured)、持久代(Perm),对不同生命周期的对象使用不同的算法。
通常JVM内存回收总是指Heap(堆)内存回收,确实只有Heap(堆)中的内容是动态申请分配的,所以以上对象的年轻代和年老代都是指的JVM的Heap(堆)空间,而持久代则是之前提到的Method area(方法区),不属于Heap(堆)。
1. 年轻代
Java应用在分配Java对象时,这些对象会被分配到年轻代堆空间中去
这个空间大多是小对象并且会被频繁回收
由于年轻代堆空间的垃圾回收会很频繁,因此其垃圾回收算法会更加重视回收效率
2. 年老代
年轻代堆空间的长期存活对象会转移到(也许是永久性转移)年老代堆空间
这个堆空间通常比年轻代的堆空间大,并且其空间增长速度较缓
由于大部分JVM堆空间都分配给了年老代,因此其垃圾回收算法需要更节省空间,此算法需要能够处理低垃圾密度的堆空间
3. 持久代
存放VM和Java类的元数据(metadata),以及interned字符串和类的静态变量
当这三个分代的堆空间比较紧张或者没有足够的空间来为新到的请求分配的时候,垃圾回收机制就会起作用。有两种类型的垃圾回收方式:次收集(Minor GC)和全收集(Full GC)。当年轻代堆空间满了的时候,会触发次收集将还存活的对象移到年老代堆空间。当年老代堆空间满了的时候,会触发一个覆盖全范围的对象堆的全收集。
至此是关于浅析JVM内存区域及垃圾回收,仅供参考。
如有疏漏错误之处,还请不吝赐教!
浅析JVM内存区域及垃圾回收的更多相关文章
- JVM内存区域与垃圾回收
1.JAVA内存区域与内存溢出 1.1.概述 Java中JVM提供了内存管理机制,Java虚拟机在执行Java程序的过程中会把内分分为不同的数据区,如图: 1.2.程序计数器 程序计数器是当前线程所执 ...
- Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- JVM内存管理及垃圾回收【转】
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- JVM内存管理和垃圾回收机制介绍
http://backend.blog.163.com/blog/static/20229412620128233285220/ 内存管理和垃圾回收机制是JVM最核心的两个组成部分,对其内部实 ...
- 浅谈JVM内存分配与垃圾回收
大家好,我是微尘,最近又去翻了周志明老师的<深入理解Java虚拟机>这本书.已经看了很多遍了,每次都感觉似乎看懂了,但没过多久就忘了.这次翻了第三章的垃圾收集器与内存分配策略,感觉有了新的 ...
- JVM内存分配与垃圾回收机制管理
项目上线,性能优化有个重要组成就是jvm内存分配和垃圾回收机制的管理配置. 网上随便能搜到相关的具体步骤,以及内存中各种参数对应的意义,不再赘述. 干货就是直接抛出遇到的问题,以及如何解决的,再说说待 ...
- JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)
转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...
- JVM的stack和heap,JVM内存模型,垃圾回收策略,分代收集,增量收集
(转自:http://my.oschina.net/u/436879/blog/85478) 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认 ...
- JVM内存管理及垃圾回收
一.JVM内存的构 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法.总体分为下面几个部分: 程序计数器(Progra ...
随机推荐
- Mybatis的mapper代理开发方法
一.开发规范 1.映射文件中的namespase等于mapper接口类路径 2.statement的id与mapper中的方法名一致 3.让mapper的接口方法输入参数类型与statement中的p ...
- 【luogu P2279 [HNOI2003]消防局的设立】 题解
题目链接:https://www.luogu.org/problemnew/show/P2279 想怎么贪怎么贪 #include <queue> #include <cstdio& ...
- Oracle中字符串截取常用方法总结
substr 函数:截取字符串 语法:SUBSTR(string,start, [length]) string:表示源字符串,即要截取的字符串. start:开始位置,从1开始查找.如果start ...
- .net core 基于Claim登录验证
网站,首先需要安全,实现安全就必须使用登录验证,.net core 基于Claim登录验证就很简单使用. Claim是什么,可以理解为你的身份证的中的名字,性别等等的每一条信息,然后Claim组成一个 ...
- springsource-tool-suite插件下载
下载地址: https://spring.io/tools3/sts/all/ 下载页面上的 update sites archives文件
- JQuery制作网页——第五章 初识 jQuery
1.jQuery简介: ● jQuery由美国人John Resig于2006年创建 ● jQuery是目前最流行的JavaScript程序库,它是对JavaScript对象和函数的封装 ● 它的设计 ...
- 一、PHP基础-安装PHP集成环境
目录 PHP运行集成环境下载 phpStudy集成环境安装 XAMPP集成环境安装 WampServer环境安装 作者:吴耀田 个人博客:http://www.cnblogs.com/isaacwy ...
- excel 开头 结尾,中间 类似 SQL like ab% ,%ab ,%ab%
excel 开头 结尾,中间 类似 SQL like 'ab%' ,'%ab' ,'%ab%' 在R2 单元格 查找 ab开头,ab结尾 =Search("ab",R ...
- GitLab 基本操作
登录 在浏览其中输入http://192.168.3.11:8888 如图1登录界面. 图1 注:第一次新增用户,会发送修改密码链接到用户的邮箱中,用户会收到如图2邮件. 图2 2. 修改密码 点 ...
- go基础语法-函数
1.基础定义 golang的函数很'纯粹',只有可变参数列表的概念,没有默认参数.可选参数.函数重载.操作符重载这些难以把控的概念 语法:'func'声明,而后函数名在前,中间的括号内定义参数,返回值 ...