本文是一篇关于方法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
---------------------------------

转载于:https://www.cnblogs.com/xinyuyuanm/p/3150273.html

方法javaJVM学习笔记-内存处理相关推荐

  1. SVO中 Inverse Compositional Image Alignment方法的学习笔记

    SVO中 Inverse Compositional Image Alignment方法的学习笔记 这篇文章 光流法简介 逆向光流法 结尾 这篇文章  在SVO系统中的"Relaxation ...

  2. 2 Oracle深度学习笔记 内存架构之UGA

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 2.Or ...

  3. 2.Oracle深度学习笔记——内存架构之UGA

    2.Oracle深度学习笔记--内存架构之UGA 欢迎转载,转载请标明出处:  http://blog.csdn.net/notbaron/article/details/50558136 UGA是回 ...

  4. 基于迁移学习的旋转机械故障诊断方法研究学习笔记

    基于迁移学习的旋转机械故障诊断方法研究学习笔记 现在大一点的神经网络模型也要求数据量的足够大,但是对于小样本的数据,有一些神经网络模型也能够处理的很好 2. 这是现在神经网络也要求的数据最好能够独立同 ...

  5. python面向对象编程中方法和属性_Python面向对象编程中关于类和方法的学习笔记...

    Python面向对象编程中关于类和方法的学习笔记 类与类方法是面向对象的编程语言中必不可少的特性,本文总结了Python面向对象编程中关于类和方法的学习笔记,需要的朋友可以参考下 类和实例 pytho ...

  6. 更灵活的定位内存地址的方法---汇编学习笔记

    更灵活的定位内存地址的方法 前面,我们用[0].[bx]的方法,在访问内存的指令中,定位内存单元的地址.本章将用更灵活的方式来定位内存地址. 7.1 and和or指令 (1)and指令:逻辑与指令,按 ...

  7. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  8. 计算机网络篇—《自顶向下方法》学习笔记

    前言 1.眼过千遍,不如手过一遍 2.内容太多,梳理理解记忆 3.菜鸟初学,写笔记的方式容易坚持下来,并且不易分心. 于是有了这篇计算机网络学习笔记,如有问题,欢迎指正. 一.概述 1.因特网 因特网 ...

  9. 《南溪的目标检测学习笔记》——后处理方法的学习笔记

    1 前言 后处理方法是很重要的,我在学习训练COCO数据集时深有体会,这里用笔记记录一下后处理的相关知识- 2 南溪使用的的后处理方法 南溪使用后处理操作流程: 阈值过滤(低阈值去框,提速nms)→\ ...

最新文章

  1. 创建Okhttp自定义Log
  2. jquery对象PHP转换,jQuery对象与DOM对象转换方法详解_jquery
  3. JavaWeb002-servlet基础
  4. 与 Josh Bloch 探讨 Java 未来
  5. 043_CSS32D转换
  6. 当我说要做大数据工程师时他们都笑我,直到三个月后……转
  7. React Native开发环境搭建记录
  8. 快手基于 Flink 的持续优化与实践
  9. 图像滤镜艺术---微软自拍APP滤镜实现合集DEMO
  10. JavaScript:屏蔽浏览器右键点击事件
  11. 如何将c语言转成汇编语言,如何把汇编语言转换成C语言
  12. python语言程序设计实践教程陈东实验八的答案_大学生C语言程序设计(第四版 谭洪强)实验8答案...
  13. 2D武侠游戏《剑侠世界》网游单机 搭建教程说明
  14. 模拟京东快递单号查询
  15. LTM系统并联接入方式数据包交互分析
  16. 《那些年啊,那些事——一个程序员的奋斗史》——21
  17. 面向对像(8day) 正则表达式,日志格式,json模块
  18. 最强 Python 数据可视化库,没有之一!
  19. 如何使用Photoshop 2021给图片制作出渐变效果?
  20. 定位导航——旋转矩阵,IMU,左右乘

热门文章

  1. 《死亡笔记》与绵球方块先生
  2. $unit编译单元声明
  3. Java字符串与包装类
  4. 读进程和写进程同步设计_浅谈unix进程进程间通信IPC原理
  5. python异步io 队列_python 学习笔记九 队列,异步IO
  6. python八大选择排序_python之八大排序方法
  7. win10虚拟内存怎么设置最好_淘宝直通车时间段怎么设置?哪个时间段开最好?...
  8. 对pca降维后的手写体数字图片数据分类_【AI白身境】深度学习中的数据可视化...
  9. easy excel date 类型解析报错_ptarchiver原理解析
  10. nginx location 正则表达式匹配多个地址_就是要让你搞懂Nginx,这篇就够了!