本系列的第一篇文章,预计本系列最后面会有两三个案例。

Java与C、C++不一样Java不需要Coder进行手动内存管理,而这一切都交给JVM进行自动内存管理,这从某种程度上来说也减轻了我们Coder不少的编码量,而我们是否还有必要了解JVM的内存管理机制呢,答案是否定的;因为Java也会和C、C++一样发生内存泄漏、内存溢出,尽管它发生这些事故会少很多,但一旦发生了而你又不了解他的内存管理机制这将是非常棘手的问题;还有个原因就是Java是运行在JVM上的,而不能JVM参数可能会影响到程序的执行性能,我们要想JVM在具体的应用中达到最优的性能那就必须了解JVM的内部机制;废话不多说现在开始JVM探索系列之——内存管理

根据《Java虚拟机规范》所规定的,Java虚拟机执行Java程序时它他管理的内存划分为几个区域,也就是运行时数据区(Run-Time Data Areas);这些区域的功能、生命周期各不相同,主要分为两大类:一种是随着JVM进程的启动而创建,随JVM进程消亡而销毁;一种是随着线程的创建而创建,随着线程的销毁而销毁,《Java虚拟机规范》规定的内存区域有如下图:

红色边框的两块区域为所有线程共享的(JVM进程的启动而创建、进程消亡而销毁)

其他三块区域为线程隔离的(线程的创建而创建,随着线程的销毁而销毁)

如图所示,运行时数据区(Run-time Areas)分为:方法区(Method Areas)、堆(Heap)、Java栈(Java Stacks)、本地方法栈(Native method stacks)、PC寄存器(Register)组成;

1、  PC寄存器(PC Register)

PC寄存器(PC Register),用户存储当前运行的指令(字节码指令)地址,线程所私有的每个线程都有个独立的寄存器;如正在执行的是Java方法则存字节码指令地址,如是Native方法则值为空(undefined)。

2、  Java虚拟机栈(Java Virtual Machine Stacks)

Java虚拟机栈,线程独有生命周期与线程一致;Java虚拟机栈用于存放栈帧,Java方法执行时会创建一个栈帧(Stack Frame)存储局部变量表、操作数栈、动态链接、方法出口等信息,方法开始执行栈帧(Stack Frame)入Java虚拟机栈中,方法执行完成则出栈。(《Java虚拟机规范》规定Java虚拟机栈会抛出两种异常:StackOverlowError与OutOfMemoryError,第一种为栈线程请求栈容量超过Java虚拟机允许的最大容量,第二种为无法分配到足够的内存)。

3、  堆(Heap)

在java虚拟机中堆是所有线程锁共享的,Java虚拟机启动的时候创建,用于存放对象实例与数组内存分配,

4、  本地方法栈(Native Method stack)

用于执行Native方法,有些虚拟机把他与Java虚拟机栈合在一起,(如:HotSpot),抛出两种异常:StackOverlowError与OutOfMemoryError。

5、  方法区(Method Areas)

方法区与Java堆一样虚拟机启动的时候创建,所有线程共享;存储被虚拟机加载的类信息、运行时常量池、字段、方法数据即时编译器编译后的字节码内容等,存储的内容基本上来自class文件;不同的虚拟机实现方法区不一样,在HotSpot虚拟机中可以把方法区称为永生代,GC分代收集会对方法区进行回收。当方法区无法满足内存分配时,Java虚拟机将抛出一个OutOfMemoryError异常。

5.1  运行时常量池(Runtime Constant Pool)

运行时常量池,方法区的一部分,类或接口常量池的运行时表现形式,存储编译后生成的字面量与符号引用(方法、字段的引用);可以在运行期间加入常量,String类的intern(),方法就是如此。无法申请到内存是抛出OutOfMemoryError异常。

介绍完JVM内存的各个区域后,我们来看一下下面的代码:

public class Model {

private static int i=1;

public Model() {

}

}

当我们实例化Model model=new Model()后,i将存储到方法区(Method Aeras)的运行时常量池(Runtime Constant Pool)中,实例化后的model的引用(reference)将存储到Java虚拟机栈本地变量表中,而new Model()对应的实例(实例数据)将存储到Java堆(Java Heap)中,构造函数Model()也将存储到方法区中。

个人博客同时更新站点:Http://www.solinx.co

JVM探索之——内存管理(一)的更多相关文章

  1. JVM探索之内存管理(三)

    上节我们介绍了JVM垃圾回收的原则,还有几个垃圾收集算法:标记-清除算法.复制算法.标记整理算法.分代收集算法:现在将要说HotSpt的垃圾收集器,这小节将只是理论. Java虚拟机规范对垃圾收集器的 ...

  2. JVM探索之——内存管理(二)

    上篇文章我们介绍了JVM所管理的内存结构也就是运行时数据区(Run-Time Data Areas),现在我们将介绍JVM的内存分配与回收静态内存分配与动态内存分配 JVM的内存分配主要分为两种:静态 ...

  3. JVM介绍&自动内存管理机制

    1.介绍JVM(Java Virtual Machine,Java虚拟机) JVM是Java Virtual Machine的缩写,通常成为java虚拟机,作为Java可以进行一次编写,到处执行(Wr ...

  4. PHP内核探索:内存管理开篇

    内存是计算机非常关键的部件之一,是暂时存储程序以及数据的空间,CPU只有有限的寄存器可以用于存储计算数据,而大部分的数据都是存储在内存中的,程序运行都是在内存中进行的.和CPU计算能力一样, 内存也是 ...

  5. Java Core - JVM运行时内存管理

    在读正文之前,阅读以下两篇博客学习并理解堆栈.作用域.本地方法的概念. 作用域:https://www.cnblogs.com/AlanLee/p/6627949.html 操作数栈:https:// ...

  6. JVM学习笔记-内存管理

    第一章 内存分配 1. 内存区域.     方法区和堆(线程共享),程序计数器 , VM栈 和 本地方法栈(线程隔离).     1) java虚拟机栈:线程私有.描写叙述的是java方法执行的内存模 ...

  7. 深入理解JVM(一) -- 自动内存管理机制

    Java运行时数据区域分为:程序计数器,虚拟机栈,本地方法栈,Java堆,方法区,运行时常量池,直接内存,结构如下: 1.程序计数器: 是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示 ...

  8. jvm之自动内存管理

    一.运行时数据区 程序计数器(线程私有) 1.程序计数器占用jvm内存较小,主要用来记录当前线程所执行的字节码的位置,因为jvm的多线程都是通过cpu对线程进行来回切换,所以在某个确定的时间cpu只会 ...

  9. spark 源码分析之十五 -- Spark内存管理剖析

    本篇文章主要剖析Spark的内存管理体系. 在上篇文章 spark 源码分析之十四 -- broadcast 是如何实现的?中对存储相关的内容没有做过多的剖析,下面计划先剖析Spark的内存机制,进而 ...

随机推荐

  1. 点我吧工作总结(技术篇) Velocity

    1. 什么是velocity Velocity[vəˈlɑ:səti],名称字面翻译为:速度.速率.迅速.该项目的开源地址:http://velocity.apache.org/,它是一个基于Java ...

  2. [moka同学笔记]YII2.0 判断签约状态,sql的两种查询方法

    方法一: //判断签约状态 $signed = 0; $sql="SELECT * from usho_community_sign_record WHERE com_id=$r->i ...

  3. Guava学习笔记:EventBus

    EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现.对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和 ...

  4. 实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以

    通常,我们都是在业务层和界面层使用枚举类型,这能够为我们编程带来便利,但在数据访问层,不使用枚举类型,因为很多数据库都不支持,比如我们现在用的SqlServer2008就不支持枚举类型的列,用的时候也 ...

  5. Web持久化存储Web SQL、Local Storage、Cookies(常用)

    在浏览器客户端记录一些信息,有三种常用的Web数据持久化存储的方式,分别是Web SQL.Local Storage.Cookies. Web SQL 作为html5本地数据库,可通过一套API来操纵 ...

  6. Jquery属性获取——attr()与prop()

    今天在项目中使用<select></select>下拉菜单时,使用juery操作,使页面加载完菜单默认选中的值为2,我一开始的操作如下: <!--html部分--> ...

  7. HTML <base> 标签 为页面上的所有链接规定默认地址或默认目标

    定义和用法 <base> 标签为页面上的所有链接规定默认地址或默认目标. 通常情况下,浏览器会从当前文档的 URL 中提取相应的元素来填写相对 URL 中的空白. 使用 <base& ...

  8. Linux新手扫盲

    一. Linux特点 1.免费/开源: 2.支持多线程/多用户: 3.安全性好: 4.对内存和文件管理优越. Linux最小只需4M ——> 嵌入式开发 二. 文件目录 Linux系统所有软硬件 ...

  9. Problem with WinRM on Exchange 2013 Management Shell and Exchange Toolbox on a new exchange 2013 with CAFE and BE on single server installation

    While deploying MS Exchange 2013 I experienced issues with accessing the Exchange Management Shell a ...

  10. UIWebView的应用和其中的JS与OC间传值

    现在有很多的应用已经采用了WebView和html语言结合的开发模式.html5一直很火因为一份代码可以在多个平台上运用啊,效果各不相同都很美观,也越来越有一些公司直接招后台程序员和html5程序员, ...