一、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内存区域及垃圾回收的更多相关文章

  1. JVM内存区域与垃圾回收

    1.JAVA内存区域与内存溢出 1.1.概述 Java中JVM提供了内存管理机制,Java虚拟机在执行Java程序的过程中会把内分分为不同的数据区,如图: 1.2.程序计数器 程序计数器是当前线程所执 ...

  2. Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  3. JVM内存管理及垃圾回收【转】

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  4. JVM内存管理和垃圾回收机制介绍

    http://backend.blog.163.com/blog/static/20229412620128233285220/     内存管理和垃圾回收机制是JVM最核心的两个组成部分,对其内部实 ...

  5. 浅谈JVM内存分配与垃圾回收

    大家好,我是微尘,最近又去翻了周志明老师的<深入理解Java虚拟机>这本书.已经看了很多遍了,每次都感觉似乎看懂了,但没过多久就忘了.这次翻了第三章的垃圾收集器与内存分配策略,感觉有了新的 ...

  6. JVM内存分配与垃圾回收机制管理

    项目上线,性能优化有个重要组成就是jvm内存分配和垃圾回收机制的管理配置. 网上随便能搜到相关的具体步骤,以及内存中各种参数对应的意义,不再赘述. 干货就是直接抛出遇到的问题,以及如何解决的,再说说待 ...

  7. JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)

    转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...

  8. JVM的stack和heap,JVM内存模型,垃圾回收策略,分代收集,增量收集

    (转自:http://my.oschina.net/u/436879/blog/85478) 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认 ...

  9. JVM内存管理及垃圾回收

    一.JVM内存的构 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法.总体分为下面几个部分: 程序计数器(Progra ...

随机推荐

  1. LayIM项目之基础数据获取代码优化,Dapper取代ADO.NET

    前言 最近在开发LayIM融云版,也在进行项目重构,现在在看之前的代码,简直不敢直视.不过不知道以后看现在的代码是不是也是糟糕的一批.LayIM有个接口,一般接触过的开发人员都不会生疏,就是init接 ...

  2. Selenium应用代码(读取excel的内容进行注册的案例)

    1. 封装读取excel数据的方法:import java.io.*;import java.util.ArrayList;import java.util.List; import jxl.*;im ...

  3. 二叉树前序、中序、后序非递归遍历 144. Binary Tree Preorder Traversal 、 94. Binary Tree Inorder Traversal 、145. Binary Tree Postorder Traversal 、173. Binary Search Tree Iterator

    144. Binary Tree Preorder Traversal 前序的非递归遍历:用堆来实现 如果把这个代码改成先向堆存储左节点再存储右节点,就变成了每一行从右向左打印 如果用队列替代堆,并且 ...

  4. TCP Three-way Handshake

    TCP Connection Management Out-of-Order and Duplication(复制) Problem Old segment from previous connect ...

  5. 使用java原生API模拟请求下载文件

    /** * * @param urlPath * 下载路径 * @param saveDir * 下载存放目录 * @return 返回下载文件 * @throws Exception */ publ ...

  6. iOS多语言设置

    最近公司做的项目需要向国外推广,因此app需要添加相应的语言设置,为此整理记录下多语言设置的过程.如有不对的地方,欢迎各位大神指正.下面就详细介绍下设置的过程: 1.基本设置 第一步:首先在 项目工程 ...

  7. React Native从零到一搭建开发环境

    React Native从零到一搭建开发环境 ReactNative环境搭建 安装Homebrew 安装rvm 安装nvm 安装node 安装react-native-cli 安装watchman i ...

  8. iOS视频处理

    在iOS中,apple提供了AVFoundation 用来处理音视频,基本能满足一些常用的音视频处理需求,而且能调用的硬件编解码接口,能提高不少效率,这是其它库所不能达到的.最近做过的Recnow S ...

  9. .Net core 使用SSH.Net上传到SFTP服务器和和下载文件

    今天换了个服务器,文件上传到sftp服务器上了,那么ftp和sftp服务器有什么区别呢,正常来说sftp会更安全一些. 废话不多说,首先.net core 上传到sftp需要引入一个Nuget包,就是 ...

  10. Jquery中数值求和及根据余数改变对应的数值样式

    Jquery内容 <script type="text/javascript"> $(function () { var num = 0; $(".box o ...