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。

下图表示内存分配图:

 

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

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

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

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

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

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

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

final、static、final static总结

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

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

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

Java中的内存处理机制和final、static、final static总结相关推荐

  1. 深入理解Java中的内存泄漏

    理解Java中的内存泄漏,我们首先要清楚Java中的内存区域分配问题和内存回收的问题本文将分为三大部分介绍这些内容. Java中的内存分配 Java中的内存区域主要分为线程共享的和线程私有的两大区域: ...

  2. Java基础-Java中的内存分配与回收机制

    Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二. 转载于:https://www.cnblogs.com/yinzhengji ...

  3. Java基础-Java中常用的锁机制与使用

    Java基础-Java中常用的锁机制与使用 锁lock或互斥mutex是一种同步机制,主要用于在存在多线程的环境中强制对资源进行访问限制.锁的主要作用为强制实施互斥排他以及并发控制策略.锁一般需要硬件 ...

  4. Java中关于内存泄漏出现的原因以及如何避免内存泄漏

    转账自:http://blog.csdn.net/wtt945482445/article/details/52483944 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静 ...

  5. (转载)Java中关于内存泄漏出现的原因以及如何避免内存泄漏

    原文链接 Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实 ...

  6. Java中的等待/通知机制(wait/notify)

    为什么80%的码农都做不了架构师?>>>    当一个线程修改了一个对象的值,另外一个线程需要感知到这个变化,并且做出相应的操作时,可以使用Java中的等待/通知机制去实现这个功能. ...

  7. ​Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子​

    作者 l 会点代码的大叔(CodeDaShu) JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看. 01 内存泄漏 & 内存溢出 1. 内存泄漏(memory lea ...

  8. java中的内存分配原则

    问题:Java中这些类.变量.字符串.方法,在内存中是怎样分配的? 首先,Java中的内存区域如下: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是 ...

  9. 介绍Java中的内存泄漏

    转载自  介绍Java中的内存泄漏 Java语言的一个关键的优势就是它的内存管理机制.你只管创建对象,Java的垃圾回收器帮你分配以及回收内存.然而,实际的情况并没有那么简单,因为内存泄漏在Java应 ...

  10. 内存映射文件 写入 卡住_在Java中使用内存映射文件时检测(写入)失败

    内存映射文件 写入 卡住 内存映射文件是一个很好的并且经常被忽视的工具. 我不会在这里详细介绍它们的工作方式(使用 力 Google Luke!),但我将快速总结其优势: 操作系统提供的延迟加载和写入 ...

最新文章

  1. np.trapz 生动的解释
  2. 【Kafka】Kafka为什么要加入分区的概念
  3. 使用泛型 ,做计算器
  4. tcp/ip 协议栈Linux源码分析二 IPv4分片报文重组分析二
  5. mongodb 企业版_MongoDB 凉了?
  6. Windows 8的无线设置后,竟不能直接更改,目前知道可以通过命令行解决
  7. PPT | 云客堂——云服务助力Java 应用程序开发及部署
  8. 杂项-事务:OLTP(联机事务处理过程)
  9. 使用.NET和Jquery打造简单的便签纸
  10. Android ADT 无法在线安装,离线下载ADT压缩包方法。SDK Manager无法更新
  11. java实现KMZ文件转KML文件
  12. HBuilderX搭建Vue项目
  13. 服装尺寸 html,女装标准尺码对照表,服装尺寸对照表,衣服尺码对照表
  14. python找不到模块pyodbc_python安装pyodbc模块
  15. html5 游戏ui设计,7款手机游戏UI界面设计欣赏
  16. 盛世看增长,乱世看效率 from 思维碎片@知识星球
  17. USB | 1. 技术演进及测试概览
  18. 【高级微观经济学】厂商理论:生产技术与生产函数
  19. picsart下载_PicsArt下载-PicsArt 安卓版v15.9.53-PC6安卓网
  20. Google浏览器主页被搜狗导航劫持解决方法(也适用于火狐浏览器)

热门文章

  1. Atitit.研发管理软件公司的软资产列表指南
  2. Atitit. C# java 的api 目录封装结构映射总结
  3. 快速开发字段很多的MIS表
  4. bbs与BLOG与SNS在区别
  5. (转)比特币算法——SHA256算法介绍
  6. (转)策略回测的框架、实现、测试
  7. 企业如何用好云、管好云?
  8. 与生命赛跑,Serverless提升AI诊断效率90% | 凌云时刻
  9. 最新消息!阿里宣布延迟复工,字节跳动、腾讯......等企业也再次延迟!
  10. 易建科技eKing Cloud招聘,快到碗里来~