java final内存机制_Java中的内存处理机制和final、static、final static总结

装载自:http://blog.csdn.net/wqthaha/article/details/20923579

Java程序运行在JVM上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性,由此可见JVM的重要性。所以在学习Java内存分配原理的时候一定要牢记这一切都是在JVM中进行的,JVM是内存分配原理的基础与前提。

一个完整的Java程序运行过程会涉及以下内存区域:

寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。

栈:保存局部变量的值,包括:a.用来保存基本数据类型的值;b.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧。

堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。

常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用(1)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中。

代码段:用来存放从硬盘上读取的源程序代码。

全局数据段:用来存放static定义的静态成员或全局变量。分配该区时内存全部清0,结果变量的初始化为0。

下图表示内存分配图:

1339378152_2914.jpg

对于java 和内存之间,有如下几点需要注意:

1.一个Java文件,只要有main入口方法,我们就认为这是一个Java程序,可以单独编译运行。

2.无论是普通类型的变量还是引用类型的变量(俗称实例),都可以作为局部变量,他们都可以出现在栈中。只不过普通类型的变量在栈中直接保存它所对应的值,而引用类型的变量保存的是一个指向堆区的指针,通过这个指针,就可以找到这个实例在堆区对应的对象。因此,普通类型变量只在栈区占用一块内存,而引用类型变量要在栈区和堆区各占一块内存。

3.分清什么是实例什么是对象。Class a= new Class();此时a叫实例,而不能说a是对象。实例在栈中,对象在堆中,操作实例实际上是通过实例的指针间接操作对象。多个实例可以指向同一个对象。

4.栈中的数据和堆中的数据销毁并不是同步的。方法一旦结束,栈中的局部变量立即销毁,但是堆中对象不一定销毁。因为可能有其他变量也指向了这个对象,直到栈中没有变量指向堆中的对象时,它才销毁,而且还不是马上销毁,要等垃圾回收扫描时才可以被销毁。

5.以上的栈、堆、代码段、数据段等等都是相对于应用程序而言的。每一个应用程序都对应唯一的一个JVM实例,每一个JVM实例都有自己的内存区域,互不影响。并且这些内存区域是所有线程共享的。这里提到的栈和堆都是整体上的概念,这些堆栈还可以细分。

6 .类的成员变量在不同对象中各不相同,都有自己的存储空间(成员变量在堆中的对象中)。而类的方法却是该类的所有对象共享的,只有一套,对象使用方法的时候方法才被压入栈,方法不使用则不占用内存。

final、static、final static总结

final如果用来表示数据变量的话,通常是指该变量被赋值一次,就不能改变指。

static如果用来表示未创建的对象里的数据变量时,就可以直接在对象里直接使用,通常指静态变量、全局变量(在JAVA中没有全局变量一说)

final static合用表示可以直接调用的数据,不用再去在以创建的类中申明,而且该变量不能后面赋值修改。通常可以与private访问限制一起使用。

原文:http://www.cnblogs.com/w-wfy/p/7215804.html

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

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

相关文章

MySQL中的字符集涵义及使用方法总结(二)

五.乱码的避免最好让上述9个字符集变量值保持一致,或者至少“兼容”,同时也要考虑到OS中locale的值。当然:character_set_system例外,它是存储和表示元信息使用的字符集,一般都是ascii串,使用utf8和使用lat…

vim 多行添加注释,取消注释

转发 已经验证 https://blog.csdn.net/SuiXin_123/article/details/81393397转载于:https://www.cnblogs.com/pingg/p/10509301.html

调用未知DLL中的导出函数

不知道诸位看官是否有过这样的经历:在不经意之间发现一个DLL文件,它里边有不少有趣的导出函数——但是由于你不知道如何调用这些函数,所以只能大发感慨而又无能为力焉。固然有些知名的DLL可以直接通过搜索引擎来找到它的使用方式(…

构建之法与博客首秀

问题一:软件的安全功能是指什么呢? 我看了《构建之法》第七页对飞机安全功能的的描述,想知道在软件中是否有类似飞机的安全功能?如果有,具体是指什么功能呢?我在查阅资料后只找到对软件安全的的总结(软件安…

java接口import_深入理解Java架构师在组件注册@Import导入容器(ImportSelector接口)的神操作!...

ImportSelector:返回需要导入的组件的全类名数组创建一个实现了ImportSelector接口的类,然后让入Import中。ImportSelector的实现类包含了所有需要导入到容器中的组件。public class StuConfigurationImportSerlect implements ImportSelector {Override…

java builder pool_每周10道Java面试题:String, String Pool, StringBuilder

每周10道 Java 面试题由 ImportNew 整理编译自网络。1. 写出下面代码的运行结果。int src 65536;Integer dst new Integer(65536);System.out.println(src dst);System.out.println(dst.equals(src));答案: true true考点: Integer 的 equals 实现。查…

将字符串中的字符按Z字形排列,按行输出

示例1: Input: s "PAYPALISHIRING", numRows 3 Output: "PAHNAPLSIIGYIR" 示例2: Python解决方案: def convert(self, s, numRows):""":type s: str:type numRows: int:rtype: str"""…

大型网络架构变迁和知识图谱

——仅供个人学习使用,如有侵犯版权,请作者联系我,立马处理。 【前端页面缓存】 sessionStorage,localStorage,userData,cookie, [sessionStorage] h5后出现的新技术,这个生命周期短,当页面关闭后,存储资源…

H265摄像头如何实现网页直播

介绍 目前安防监控行业,基本所有的摄像头都支持H264编码,但是已经有部分摄像头开始支持H265,并且支持H265的摄像机已经越来越多。H265相比H264有着很多优势,是压缩更高,网络传输消耗的带宽更小,相同码率下H…

【Python selenium自动化环境配置】4步搞定ChromeDriver版本选择

很多刚做自动化的小伙伴,会在ChromeDriver版本选择时犯难,看来大家都被坑过,真正掌握独门绝技,都不是难事儿。 看好了主要步骤就4部 1、确定谷歌浏览器版本 2、找到谷歌浏览器版本与ChromeDriver版本对应关系 3、下载ChromeDriver…

[贴图]TVB香港大部分演员照片、姓名(值得收藏)

转载于:https://www.cnblogs.com/chinhr/archive/2006/11/15/561101.html

我的世界java笔刷指令_《我的世界》基本笔刷教程

《我的世界》是一款3D的第一人称沙盘游戏,所呈现的世界并不是华丽的画面与特效,而是注重在游戏性上面。玩家在游戏中做着建设与破坏两件事,但是透过像乐高一样的积木来组合与拼凑,轻而易举的就能制作出小木屋、城堡甚至城市&#…

idea创建springcloud主工程和springboot子项目

创建主工程,选择file-new-project,选择maven,直接next 填写GroupId包名,ArtifactId项目名,next-finish 创建子项目springboot,项目右击-new-module-Spring Initializr-->next 填写项目相关信息,next 选择Clou…

小程序实现无限瀑布流

实现瀑布流 实现效果 有好几种方案 1.用column-count属性把页面元素分为俩列或多列来实现 2.用display flex 分列来展示页面 3.比如说用js实现 我今天介绍的就是第三种,因为前两种都会有局限,实现的效果我们希望是左右左右,而不是分成两列去显…

python canny检测_【数字图像分析】基于Python实现 Canny Edge Detection(Canny 边缘检测算法)...

Canny 边缘检测算法Steps:高斯滤波平滑计算梯度大小和方向非极大值抑制双阈值检测和连接代码结构:Canny Edge Detection|Gaussian_Smoothing||convolution.py|||convolution()||gaussion_smoothing.py|||dnorm()|||gaussian_kernel()|||gaussian_blur()|Sobel_Filte…

java 拖放文字_myeclipse2014如何实现jsp中的html代码的文字拖放

本帖最后由 liyihongcug 于 2015-3-5 16:53 编辑把 jsp打开 (visual jsp editor)之后上班区 单击右键 show --- pallette就可以了感叹myeclipse确实强大的 标签技术强于.net mvc强。vs2013能实现iis无需安装的情况下 动态指定 某个页面为首选 启动 --------------------希望2…

因缺思厅的绕过

看一下页面源码,看到source.txt。所以进入同目录下的source.txt 代码审计下,并且百度了一些函数。过滤了很多关键字,因此常规的SQL注入没有头绪。想了挺久,因为要满足三个条件。1:不能输入过滤的关键字2:只…

Python自制微信机器人:群发消息、自动接收好友

运营公众号也有半年了,今年5月份开始的,之前一直用一款windows工具来运营自动接受好友请求、群发文章、自动回复等操作,但颇有不便。 举几个场景: 突然在外面看到一篇文章很好,临时写了一篇,想群发一下。好…

记一次webpack4+react+antd项目优化打包文件体积的过程

背景 最近自己整了一个基于webpack4和react开发的博客demo项目,一路整下来磕磕碰碰但也实现了功能,就准备发到阿里云上面去看看,借用了同事的阿里云小水管服务器,配置完成之后首页加载花了十几秒,打开控制台network查看…

[19/03/16-星期六] 常用类_Date时间类DateFormat类

一、Date时间类 计算机中 以1970 年 1 月 1 日 00:00:00定为基准时间,每个度量单位是毫秒(1秒的千分之一) 用ong类型的变量来表示时间,如当前时刻数值:long now new System.currentTimeMillis(); 【常用方法】 1. Date() 分配一个Date对象&a…