本文是一篇关于方法java的帖子

大多数JVM将内存区域分离为Method Area(Non-Heap),Heap,Program Counter Register,Java Method Statck,Native Method Stack和Direct Memomry(备注:Directory Memory并不属于JVM管理的内存区域)。前三者一般翻译为:方法区、堆、程序计数器。但不同的资料和书籍对于后者的翻译名不尽相同,这里将他们分离翻译为:Java方法栈、本地方法栈和直接内存区域。对于不同的JVM。内存区域分离可能会有所差异,比如Hot Spot就将Java方法栈和本地方法栈合二为一,统称为方法栈(Method Stack)

首先我们熟悉一下一个一般的Java程序的任务过程。一个Java源文件,会被编译成字节码(ByteCode),然后告诉JVM程序的运行入口,在被JVM通过字节码解释器加载运行。那么程序开始运行后,是如何涉及到各内存区域的呢?

概括地说,JVM每碰到一个线程,就为其分配一个程序计数器、Java方法栈和本地方法栈。当线程终止时,两者所占有的内存空间会被释放掉。栈中保存的是栈帧,可以说每个栈帧对应一个“运行现场”。如果出现一个局部对象,则它的实例数据被保存在堆中,而类数据被保存在方法区。

我们用下面这一段文字就描述完了每个内存区域的基本功能,但是这还是比拟粗拙,下面就分离分析它们的存储对象、生存周期与空间管理策略。

程序计数器

  • 线程特性:私有
  • 存储内容:字节码文件指令地址(Java Methods),或Undefined(Native Methods)
  • 生命周期:随线程而生逝世
  • 空间策略:占用内存很小

这个最简略,就先从它提及。程序计数器,是线程私有(与线程共享相对)的,也就是说有N个线程,JVM就会分配N个程序计数器。如果当线程在执行一个Java方法,程序计数器记录这着线程所执行的字节码文件中的指令地址。线程执行的是一个Native方法,则计数器值为Undefined。

程序计数器测生存周期多长呢?明显程序计数器是伴随着线程而生,伴随线程逝世而逝世的,并且程序计数器占用的内存空间也很小。

Java方法发栈与本地方法栈

Java方法栈也是线程私有的,每个Java方法栈都是由一个个栈帧组成的,每个栈帧是一个方法运行期的基础数据结构,它存储局部变量表,操作数栈、动态链表、方法出口等信息。当线程调用了一个Java方法时,一个栈帧就被压入(Push)到响应的Java方法栈。当线程从一个Java方法返回时,响应的Java方法栈就弹出(Pop)一个栈帧。

其中要具体分析的是局部变量表,它保存着各种基本数据类型和对象引用(Object reference)。基本数据类型包括boolean、byte、char、short、int、long、float、double。对象引用,本质就逝世一个地址(也可以说是一个“指针”),该地址是堆中的一个地址,通过这个地址可以找到响应的Object(注意“找到”,具体原因会在下面解释)。而这个地址找到响应Object的方式有两种。一种是该地址存储着Pointer to Object Instance Data和Pointer to Object Class Data;另一种是该地址存储着Object Instance Data,其中又包含有Pointer to Object Class Data。

图1:间接方式

    每日一道理
我拽着春姑娘的衣裙,春姑娘把我带到了绿色的世界里。

图2:直接方式

第一种方式,Java方法栈中有Handler Pool和Instance Pool,无伦哪种方式,Object Class Data都是存储在方法区的,Object Instance Data都是存储在堆中的。

原生方法栈和Java方法栈相类似,这里不再赘述。

堆是在启动虚拟机的时候分离出来的区域,其大小由参数或者默许参数指定。当虚拟机终止运行时,会释放堆内存 。一个JVM只有一个堆,它自然是线程共享的。堆中存储的是所有的Object Instant Data以及数组(不过随着栈上分配技术、标量替换技术等优化手段的开展,对象也纷歧建都存储在堆上了),这些Instance由渣滓管理器(GrabageCollector)管理,具体会在后面的章节阐述。

堆可所以由不连续的物理内存空间组成的,并且既可以固定大小,也可以设置为可扩展的(Scalable)。

方法区

通过上述Java方法栈的分析,大家已经知道Object Class Data是存储在方法区的。除此以外,常量、静态变量、JIT编译后的代码也都都是在方法区。正因为方法去存储的数据与堆有一种类比关系,所以还被称为Non-Heap。方法区也可所以内存不连续的区域组成的,并且可设置为固定大小,也可以设置称为可扩展的,这点与堆一样。

方法区外部有一个非常重要的区域,叫做运行时常量池(Runtime Constant Pool,简称RCP)。在字节码文件中常量池(Constant Pool Table),用于存储编译器产生的字面量和符号引用。每个字节码文件中的常量池在类被加载后,都市存储到方法区中。值得注意的是,运行是产生的新常量也可以被放入常量吃中,比如String类中的intern()方法产生的常量。

直接内存区

直接内存区并不是JVM管理的内存区域的一部分,而是其以外。该区域也会在Java开发中使用到,并且存在致使内存溢出的隐患。如果对NIO有所懂得,应该会知道NIO是可以使用Native Methods来使用直接内存区的。

文章结束给大家分享下程序员的一些笑话语录:

《诺基亚投资手机浏览器UCWEB,资金不详或控股》杯具了,好不容易养大的闺女嫁外国。(心疼是你养的吗?中国创业型公司创业初期哪个从国有银行贷到过钱?)

---------------------------------
原创文章 By
方法和java
---------------------------------

方法javaJVM学习笔记-内存处理的更多相关文章

  1. 《深入理解 Java 虚拟机》学习笔记 -- 内存区域

    <深入理解 Java 虚拟机>学习笔记 -- 内存区域 运行时数据区域 主要分为 6 部分: 程序计数器 虚拟机栈 本地方法栈 Java 堆 方法区 如图所示: 1. 程序计数器(线程私有 ...

  2. JVM学习笔记——内存结构篇

    JVM学习笔记--内存结构篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存结构部分 我们会分为以下几部分进行介绍: JVM整体介绍 程序计数器 虚拟机栈 本地方法栈 堆 方法 ...

  3. JVM学习笔记——内存模型篇

    JVM学习笔记--内存模型篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存模型部分 我们会分为以下几部分进行介绍: 内存模型 乐观锁与悲观锁 synchronized优化 内 ...

  4. Linux内存管理学习笔记——内存寻址

    最近开始想稍微深入一点地学习Linux内核,主要参考内容是<深入理解Linux内核>和<深入理解Linux内核架构>以及源码,经验有限,只能分析出有限的内容,看完这遍以后再更深 ...

  5. golang 学习笔记 ---内存分配与管理

    Go语言——内存管理 参考: 图解 TCMalloc Golang 内存管理 Go 内存管理 问题 内存碎片:避免内存碎片,提高内存利用率. 多线程:稳定性,效率问题. 内存分配   内存划分 are ...

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

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

  7. java-工厂方法模式学习笔记

    1.工厂模式分三种 1.1 普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例创建,如下图所示: 就以老司机开车(土豪开奔驰,宝马:屌丝骑自行车)为例,说明一下普通工厂模式: 首先,创 ...

  8. c语言学习笔记.内存管理.

    内存: 每个程序的内存是分区的:堆区.栈区.静态区.代码区. 1.代码区:放置所有的可执行代码,包括main函数. 2.静态区:存放所有的全局变量和静态变量. 3.栈区:栈(stack),先进后出.存 ...

  9. C语言学习笔记--内存操作常见错误

    1. 野指针 (1)指针变量中的值是非法的内存地址,进而形成野指针 (2)野指针不是 NULL 指针,是指向不可用内存地址的指针 (3)NULL 指针并无危害,很好判断,也很好调试 (4)C 语言中无 ...

随机推荐

  1. java后台调用HttpURLConnection类模拟浏览器请求(一般用于接口调用)

    项目开发中难免遇到外部接口的调用,小生今天初次接触该类,跟着API方法走了一遍,如有不对的地方,还请哆哆指正,拜谢! 1 package com.cplatform.movie.back.test; ...

  2. <一>SQL优化1-4

    第一条:去除在谓词列上编写的任何标量函数        --->在select 显示列上使用标量函数是可以的.但在where语句后的过滤条件部分对列使用函数,需要考虑.因为执行sql的引擎会因为 ...

  3. 一天一个Java基础——序列化

    1.概念 Java的“对象序列化”能将一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象的时候,能把这些byte数据恢复出来,并据此重新构建那个对象. 对象序列化能实 ...

  4. 【JSP】三种弹出对话框的用法实例

    对话框有三种 1:只是提醒,不能对脚本产生任何改变: 2:一般用于确认,返回 true 或者 false ,所以可以轻松用于 if...else...判断 3: 一个带输入的对话框,可以返回用户填入的 ...

  5. 底部菜单栏(一) TabHost实现

    需求:使用TabHost实现底部菜单栏: 效果图: 实现分析: 1.目录结构: 代码实现: 1.activity_main.xml <?xml version="1.0" e ...

  6. ubuntu-12.04.1-desktop-x64下JDK环境的安装与配置

    1.上oracle官网下载最新的JDK.在这里,我的系统是ubuntu-12.04.1-desktop-amd64,目前位置JDK的最新版本位7u9.jdk-for-linux有两种安装包,一种是rp ...

  7. MySQL row模式binlog复制原理

    http://www.360doc.com/content/14/1107/14/12904276_423333021.shtml

  8. 《Python 学习手册4th》 第七章 字符串

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...

  9. Selenium2Library系列 keywords 之 _SelectElementKeywords 之 list_should_have_no_selections(self, locator)

    def list_should_have_no_selections(self, locator): """Verifies select list identified ...

  10. Centos yum源更新为阿里云

    阿里云镜像网址 http://mirrors.aliyun.com/   更新步骤 1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d ...