java 内存机制详解 (new 操作的执行原理)
来源:互联网 发布:网络电视直播在线看 编辑:程序博客网 时间:2024/06/06 10:07
1.Java的内存机制
Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后(比如,在函数A中调用函数B,在函数B中定义变量a,变量a的作用域只是函数B,在函数B运行完以后,变量a会自动被销毁。分配给它的内存会被回收),Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是 Java 比较占内存的原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!
代码实例Test01:单个对象创建
class Person{ String name; int age; public void tell(){ System.out.println("姓名:"+name+"年龄"+age); } } public class Test01 { public static void main(String[] args) { Person per=new Person(); } }在上述程序中实例化了一个对象per,在实例化对象的过程中需要在内存中开辟空间,这其中就包括栈内存和对内存。具体的内存分配如下图所示:
代码实例Test02:多个对象创建
class Person{ String name; int age; public void tell(){ System.out.println("姓名:"+name+",年龄:"+age); } } public class Test02 { public static void main(String[] args) { Person per1=new Person(); Person per2=new Person(); per1.name="张三"; per1.age=30; per2.name="李四"; per2.age=33; per1.tell(); per2.tell(); } }
关键概念:类跟数组一样,都是属于引用类型,引用类型就是指一堆对内存可以同时被多个栈内存指向。下面来看一下引用传递的简单实例。
代码实例Test03:对象引用传递1
class Person{ String name; int age; public void tell(){ System.out.println("姓名:"+name+",年龄:"+age); } } public class Test03{ public static void main(String[] args) { Person per1=new Person(); Person per2=per1; per1.name="张三"; per1.age=30; per2.age=33; per1.tell(); per2.tell(); } }
程序运行结果为:
姓名:张三,年龄:33
姓名:张三,年龄:33
代码实例Test04:对象引用传递2
class Person{ String name; int age; public void tell(){ System.out.println("姓名:"+name+",年龄:"+age); } } public class Test04 { public static void main(String[] args) { Person per1=new Person(); Person per2=new Person(); per1.name="张三"; per1.age=30; per2.name="李四"; per2.age=33; per2=per1; per1.tell(); per2.tell(); } }
上述程序运行结果为:
姓名:张三,年龄:30
姓名:张三,年龄:30
注意点:
- Java本身提供垃圾收集机制(Garbage Collection,GC),会不定期施放不用的内存空间,只要对象不用了,就会等待GC释放空间,如上面堆内存中的name="李四";age=33。
- 一个栈内存只能指向一个对内存空间,如果要想再指向其他的堆内存空间,则必须先断开已有的指向才能分配新的指向。
java中常用的内存区域
在java中主要存在4块内存空间,这些内存的名称及作用如下:
- 栈内存空间:保存所有的对象名称(更准确地说是保存了引用的堆内存空间的地址)
- 堆内存空间:保存每个对象的具体属性内容。
- 全局数据区:保存static类型的属性。
- 全局代码区:保存所有的方法定义。
- 【Java】内存机制详解(new操作的执行原理)
- java 内存机制详解 (new 操作的执行原理)
- Java的new的内存机制
- Hadoop详解(二)——HDFS的命令,执行过程,Java接口,原理详解。RPC机制
- Java关键字new-----对象的内存分配原理
- Java关键字new-----对象的内存分配原理
- Java关键字new-----对象的内存分配原理
- Java内存机制详解
- Java内存机制详解
- Java内存机制详解
- Java内存机制详解
- Java内存机制详解
- Java的内存回收机制详解
- JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)
- Java内存分配的原理详解
- C++内存分配操作符new(new operator),operator new,placement new详解
- Java内存分配机制详解
- Java内存分配原理详解
- LLDB调试
- 简单易懂的github使用教程
- Window显示流程
- 框架和原生
- mysql基本语句
- java 内存机制详解 (new 操作的执行原理)
- Spark入门(2)——生态系统
- 端口的状态详解
- linux命令学习与理解
- java基础知识--IO篇
- I2C 时序详解,精确到每一个时钟
- struts2入门,从下载到简单的配置
- 二叉树的建立和遍历
- 面试问题待解答