`
thecloud
  • 浏览: 883042 次
文章分类
社区版块
存档分类
最新评论

Java数组的内存管理

 
阅读更多

Java数组的内存管理

Java语言是典型的静态语言,因此Java的数组是静态的,即当数组被初始化之后,该数组的长度是不可变的。Java程序中的数组必须经初始化才能使用。所谓初始化,就是当数组对象的元素分配内存空间,并未每个数组元素指定初始值。

数组的初始化有以下两种方式:

静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度。

动态初始化:初始化时由程序员只指定数组长度,由系统为数组元素分配初始值。

Java的数组变量是一种引用类型的变量,数组变量并不是数组本身,它只是指向堆内存中的数组对象。因此,可以改变一个数组变量所引用的数组,这样可以造成数组长度可变的假象。

所有局部变量都是放在栈内存里保存的,不管其是基本类型的变量,还是引用类型的变量,都是存储在各自的方法栈区中,但引用类型变量所引用的对象(包括数组,普通java对象)则总是存储在堆内存中。对于java语言而言,堆内存中的对象通常不允许直接访问,为了访问堆内存中的对象,通常只能通过引用变量。引用变量本质上只是一个指针,只要程序通过引用变量访问属性,或者通过调用引用变量来调用方法,该引用变量将会由它所引用的对象代替。

当通过引用变量来访问实例属性,或者调用非静态方法时,如果该引用变量还未引用一个有效的对象,程序就会引发NullPointException运行时异常。

对象与内存控制

内存分配特指创建Java对象时JVM为该对象在堆内存中所分配的内存空间。内存回收指的是当该Javad对象失去引用,变成垃圾时,JVM的垃圾回收机制自动清理该对象,并回收该对象所占用的内存。

Static的作用就是将实例成员变为类成员。Static只能修饰在类里定义的成员部分,包括成员变量,方法,内部类,初始化块,内部枚举类、如果没有使用static修饰这些类里的成员,这里成员属于该类的实例;如果使用了static修饰,这些成员就属于类本身,从这个意义上看,static只能修饰类里的成员,不能修饰外部类,不能修饰局部变量,局部内部类。

在同一个JVM内,每个类只对应一个Class对象,但每个类可以创建多个Java对象。由于同一个JVM内每个类只对应一个Class对象,因此同一个JVM内的一个类的类变量只需要一块内存空间;但对于实例变量而言,该类每创建一个实例,就需要为实例变量分配一块内存空间。

Javap主要用于帮助开发者深入了解Java编译器的机制,其语法格式如下:javap <options> <classes>。该工具支持如下常用选项:

-c: 分解方法代码,也就是显示每个方法具体的字节码。

-l: 用于指定显示行号和局部变量列表。

-public|private|protected|package: 用于指定显示那种级别的类成员,分别对应Java4种访问控制权限。

-verbose: 用于指定显示更进一步的详细信息。

当调用某个类的构造器来创建Java对象时,系统总会先调用父类的非静态初始化块进行初始化。这个调用是隐式执行的,而且父类的静态初始化块总是会被执行。接着会调用父类的一个或多个构造器执行初始化,这个调用既可以是通过super进行显示调用,也可以是隐式调用。

当所有父类的非静态初始化块,构造器依次调用完成后,系统调用本类的非静态初始化块,构造器执行初始化,最后返回本类的实例。

分享到:
评论

相关推荐

    Java数组及其内存管理

    java 中的数组是 静态的 ,即初始化后,它索占的内存空间、数组长度是不变的。而且必须先 初始化 后使用。  数组的初始化方式:  · 静态初始化:初始化是指定数组的元素的值,由系统决定其长度。  String[] ...

    函数、内存、一维数组、二维数组

    为每一片区域都有特定的处理数据方式和内存管理方式。 栈内存  用于存储局部变量,当数据使用完,所占空间会自动释放。 堆内存  数组和对象,通过new建立的实例都存放在堆内存中。  每一个实体都有内存地址...

    java内存分配详解

    堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数 组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象...

    Java + 数组 + 初始化

    Java程序易于编写,而且有内置垃圾收集,不必考虑内存管理; Java虚拟机拥有工业级的稳定性和高度优化的性能,且经过了长时期的考验; Java拥有最广泛的开源社区支持,各种高质量组件随时可用。 Java语言常年霸占着...

    java实验报告.docx

    内存管理与垃圾收集 8 实验六 Java 异常处理的程序设计;Java 自定义异常的程序设计 13 实验七 Java 多线程程序设计应用 1 实验八 Java 泛型程序设计应用 5 实验九 Java 常用类库的应用 8 实验十 Java 标准输入/...

    java源码包2

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印  util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理...

    Java堆内存和栈内存

    在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量变成了数组...

    java8源码-java_architect:java_架构师

    Java数组和链表两种结构的操作效率,在哪些情况下(从开头开始,从结尾开始,从中间开始),哪些操作(插入,查找,删除)的效率高? Java内存泄露的问题调查定位:jmap,jstack的使用等等。 java高级 Java创建线程之后...

    C++内存管理.doc

    因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能。本期专题将从内存管理、内存泄漏、...

    java源码包---java 源码 大量 实例

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印  util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、...

    动态分区管理----用C语言(也可以用Java)实现采用首次适应算法的内存分配和回收过程。

    定义管理空闲分区的相关数据结构:采用空闲分区链表来管理系统中所有的空闲分区,链表中的每个节点表示一个空闲分区,登记有空闲分区的起始地址和长度。 定义一个简单的进程控制块,其中有对应进程分配到的内存的...

    Java开发技术大全(500个源代码).

    mutexThread.java 一个能管理临界区的线程类 demoMutex.java 使用上面这个类来演示线程的互斥 commSource.java 一个共享资源的类 demoSynchrony.java 演示线程的同步 setDataThread.java 设置数据的线程类 ...

    java源码包4

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印  util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理...

    JAVA上百实例源码以及开源项目源代码

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印  util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、...

    java源码包3

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印  util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理...

    JAVA上百实例源码以及开源项目

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印  util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、...

    数组和数据存储arry

    数组是一种数据结构,用于存储相同类型的数据元素。它是一系列相同类型的元素集合,这些元素通过索引(或者下标)来访问。在程序中,数组通常用于存储和操作大量相似类型的数据,比如数字、字符串等。 数据存储指的...

    JAVA中的内存分配策略

    而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有 可变数据结构(比如可变数组) 的存在,也不允许有嵌套或者递归的结构出现,因为它们都 会导致编译程序无法计算准确的存储空间需求.

    Java SE练习代码总结 Java学习资料

    数组属于引用数据类型,元素可以是基本数据类型和引用数据类型,创建数组会在内存中开辟一整块连续的空间,而数组名引用的是这块空间的首地址。 数组长度一旦确定,就不能修改。通过下标(索引)的方式调用指定位置...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...

Global site tag (gtag.js) - Google Analytics