方法javaJVM学习笔记-内存处理

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

    方法和java

    图1:间接方式

    

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

    方法和java

    图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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构单向不循环链表实现多项式合并

多项式合并 思路 多项式合并 P1 5 2x 8x ^8 3x^16 P2 6x 16x^6 - 8x^8 P P1 P2 5 8x 16x^6 3x^16 使用带头结点的单向不循环链表 每个节点分为三个部分,系数项,指数项,指针域 结构体表示为 struct node_st {int exponent;int …

下 终端_Linux/UNIX 下终端复用利器 tmux

tmux 是一个终端复用器(terminal multiplexer)。简介tmux 是一个终端复用器类自由软件,功能类似 GNU Screen,但使用 BSD 许可发布。用户可以通过 tmux 在一个终端内管理多个分离的会话,窗口及面板,对于同时使用多个命令行&#xf…

消失的字符串——c语言函数中的数据存储方式以及字符串实现

2019独角兽企业重金招聘Python工程师标准>>> 事情是这样的,最近在学习翁老师的Mooc之C语言程序设计,插一句,真的是好老师,讲的真的太好了,在c里的字符串这里,翁老师演示了一个小程序&#xff0c…

JQuery 文本框高亮显示插件

以前使用Mootools Js框架,文本框有个$(id).highlight()高亮方法,使其高亮显示,效果如下: JQuery 中没有这个方法,自己今天写了一个Plugin,把代码贴出来分享一下; 代码如下: jquery-h…

链方法[C# 基础知识系列]专题三:如何用委托包装多个方法——委托链

最近研究链方法,稍微总结一下,以后继续补充: 弁言: 上一专题分析了下编译器是如何来翻译委托的,从中间语言的角度去看委托,希望可以帮助大家进一步的理解委托,然而之前的分析都是委托只是封装一…

51单片机lcd1602的简单实用

基础知识准备 lcd1602简介 图片来自b站斌哥单片机 需要关注的有以下几点: RS : 高数据低命令;RS 1时,lcd1602读写数据,RS0时,lcd1602读写命令R/W:高读低写;RW1时,单片机读取lcd160…

firedebug调试Jquery

不了解的同学先“点这里”看看什么是Firebug。简单来说,Firebug是Firefox上用来监视、编辑和调试站点的CSS、HTML、DOM和JavaScript的扩展工具。 我们先到Firebug的主页上下载最新的版本装上,下面开始调试: 1、查看、编辑HTML元素及其(转) 安…

51单片机数字钟的实现

作业 用51单片机完成一个数字钟的计时及校时功能。 1、设置8个数码管的显示缓冲区为DISPBUFF[8],并初始化为02,02,-,04,08,-,03,06. 2、定时器0每隔5ms刷新一次数码管显示缓冲区,并显示时间(中断来做) 3、定时器1负责精确定时,计时1s,每隔…

Google Map API 学习三

转载于:https://www.cnblogs.com/MyFlora/p/3154066.html

慎用SELECT INTO复制表

很多时候我们习惯于用SELECTINTO 复制一个表或表结构,因为它方便,快捷,而且在某些情况下效率比INSERT INTO 效率要高一些。但是要注意: SELECT INTO 复制表或表结构的时候,只是得到了一个“外壳”,就像克隆…

信号的采样与插值重建(包含matlab)

实验任务 双频信号的采样和插值重建:对双频信号进行采样(符合奈奎斯特低通采样定理),绘制波形和频谱;编制sinc函数插值函数,对采样进行恢复,绘制波形。 实验原理 matlab代码 clear all; clos…

dc概论之IO约束

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://bb2hh.blogbus.com/logs/39654476.html 注明:如需转载,请注明作者出处,谢谢~,Author:pythonlong以下根据资料和个人体…

普通调幅(AM)与抑制载波双边带调幅(DSB)matlab编程实现

实验任务 实现单频信号的AM、DSB调制,绘制调制前后的波形和频谱 实验原理 matlab代码 AM调制 clear all; ts 0.0025; %信号抽样时间间隔 fs 1/ts; %抽样频率 t 0:ts:10-ts; %时间向量 df fs/length(t); %fft的频率分辨率 msg2 cos(2*pi*2*t); Pn fft(msg2…

MySQL中MySQL X.X Command Line Client一闪而过的问题

问题介绍:我安装完MySQL(我安装的是5.5)后,使用MySQL 5.5 Command Line Client,每次点击,总是一闪而过。解决方法如下:首先进入cmd 切入MySQL的安装目录,然后切入 bin 目录 ,输入mysqld-nt --sk…

4pam调制与解调(matlab实现)

实验原理 这是一种使用脉冲幅度调制技术的线路编码。PAM4信号有四个电压电平,每个幅度电平分别对应逻辑比特00、01、10和11。换言之,PAM4编码的每个符号由2个比特组成,它们对应一个电压电平,即幅度。 00对应-3,01对应-1,10对应1,…

普通调幅(AM)与包络检波(matlab实现)

普通调幅(AM)与包络检波 1.实验任务 采用matlab实现普通调幅信号的包络检波,并绘制包络检波后的信号的波形与频谱。 2.实验原理(请读者参见matlab通信仿真文件夹) 3.matlab代码 time.33;%采样时长 Ts1/10000;%采样…

免费Google地图API使用说明(转)

转自:http://www.cnblogs.com/mypig/articles/1936154.html01事件监视 02 03GEvent.addListener用来注册事件监视器,在这个例子中,在用户移动或拖拽地图后,输出地图中心点的经/纬. 04 05 06var map new GMap(document.getElem…

双栈共享存储空间(C++代码实现)

理论部分 理论来源&#xff1a;b站up主:跟懒猫老师快乐数据结构 C代码 #include<iostream> using namespace std; const int STACKSIZE 6; //两栈共享存储空间编程 //使用类模板编程 template<class DataType> class BothStack { private:DataType *data;//属性…

毕业三年

2013年6月&#xff0c;毕业整整3年了。曾经的同伴&#xff0c;有人创业了&#xff0c;有人升职加薪&#xff0c;也有人职场失利。而我&#xff0c;做了2年多的独立开发者。 在大学的时候我学的是.net&#xff0c;在毕业前还去考了微软的认证&#xff0c;考过了&#xff0c;但考…

Muduo 网络编程示例之五: 测量两台机器的网络延迟

Muduo 网络编程示例之五&#xff1a; 测量两台机器的网络延迟 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice t.sina.com.cn/giantchen 这是《Muduo 网络编程示例》系列的第五篇文章。 Muduo 全系列文章列表&#xff1a; http://blog.csdn.net/Solstice/category/779646.…