Java中对象的内存分配机制
一、内存划分
Java把内存划分为两种,一种是栈内存,另一种是堆内存。
1、栈内存
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
2、堆内存
堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java中的自动垃圾回收器来管理。
3、栈和堆的之间的关系
在堆中产生一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的值等于数组或对象在堆内存中的首地址,栈中的这个变量就变成了数组或对象的引用变量。引用变量就相当于是为数组或对象定义一个名词,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
说明:引用变量就是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组和对象本身在堆中分配,即使程序运行带使用new产生数组和对象的语句所在的代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它时,如引用变量x=null,才变成垃圾,不能在被使用,但是仍然占着内存,在随后的一个不明确的时间,被垃圾回收器释放掉。这个也是Java占内存较多的主要原因。
二、对象在内存中的分布
在Java语言中,要创建新的对象,需要使用new关键字和对象的类名,如Person p1 = new Person();。等号左边以类名Person作为变量类型,定义了一个变量p1,p1指向等号右边通new关键字所创建一个Person类的实例对象,变量p1就是对象的引用句柄,对象的应用句柄是在栈中分配的一个变量,对象本身是在堆中分配的。
变量在被初始化之前是不能使用的,在一个方法内部的变量必须进行初始化赋值,否则会出现编译无法通过的情况。当一个对象被创建时,会对其中各种类型的成员变量。按照如表所示自动进行初始化赋值。除了基本类型之外的变量类型都是引用类型。如上列的Person及数组。
成员变量类型 |
初始值(默认值) |
byte |
0 |
short |
0 |
int |
0 |
long |
0 |
float |
0.0 |
double |
0.0 |
char |
‘\u0000‘ |
boolean |
false |
All reference |
null |
所以,对象内存状态图中的 age 成员变量的初始值为0。
创健新的为最之后,概可以使用“ 对象名.对象成员” 的格式来访间对象的成员(包括属性和方法),Porson类对象的产生和使用方式见示例1.1。
public class TestPerson {
public static void main(String[] args) {
Person = p1 = Person();
Person = p2 = Person();
p1.age = - 30;
p1.shout();
p2.shout();
}
}
Java中对象的内存分配机制的更多相关文章
- Java 中数组的内存分配
Java 中数组的内存分配 1.Java 程序在运行时,需要在内存中分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式. 2.数组基本概念 数组是 ...
- Java基础-对象的内存分配与初始化(一定要明白的干货)
首先,什么是类的加载?类的加载由类加载器执行.该步骤将查找字节码(classpath指定目录),并从这些字节码中创建一个Class对象.Java虚拟机为每种类型管理一个独一无二的Class对象.也就是 ...
- Java中对象在内存中的大小、分配等问题
Java创建一个对象的过程 是否对象指向的类已经加载到内存了 如果没有加载,就要经过load.linking(verification.preparation.resolution).initiali ...
- JAVA中堆栈和内存分配原理
1.栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量 ...
- JAVA中堆栈和内存分配
(一).栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或 ...
- JAVA中堆栈和内存分配详解(摘抄)
在Java中,有六个不同的地方可以存储数据: 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存 ...
- Java中对象并不是都在堆上分配内存的
转(https://blog.51cto.com/13906751/2153924) 前段时间,给星球的球友们专门码了一篇文章<深入分析Java的编译原理>,其中深入的介绍了Java中的j ...
- Java内存分配机制
内存分配,主要指的是在堆上的分配, 一般的,对象的内存分配都是在堆上进行,但现代技术也支持将对象拆成标量类型(标量类型即原子类型,表示单个值,可以是基本类型或String等),然后在栈上分配,在栈上分 ...
- 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?(阿里面试)
JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆.栈.方法区等介绍的比较清楚. 上图,是一张在作者根据<Java虚拟机规范(Java SE 8)>中描述的J ...
随机推荐
- 寻找pair
给定n个整数使其两两组合成一对pair,例如给定 1 ,2 可以组成的pair为(1,1),(1,2),(2,1),(2,2),然后在这些pair中寻找第k小的pair. 输入第一行包含两个数字,第一 ...
- centOS7.4 , gcc4.8.5装cgdb
从github上clone最新releast后进入文件夹 ./configure –prefix=/usr/local CXXFLAGS=-std=c++11 make&make instal ...
- GO Exit Fatal panic
Exit() 应用程序(不只是函数)退出执行 defer 不会被执行(因为程序都退出了) log.Fatal() 输出打印内容 应用程序退出 defer 不会被执行 panic() 函数停止执行(不是 ...
- ubantu安装maven
下载地址 http://maven.apache.org/download.cgi 或直接命令行下载 wget https://downloads.apache.org/maven/maven-3/3 ...
- 【Linux】【Shell】【text】grep
grep: Global search REgular expression and Print out the line. 作用:文本搜索工具,根据用户指定的"模式(过滤条件)" ...
- Tableau如何绘制瀑布图
一.将子类别拖至列,利润拖拽至行,类型改为甘特条形图 二 右键利润-快速表计算-汇总(数据会从左向右显示累计汇总) 三.创建计算字段-[利润] 四.将负利润拖拽到大小,利润拖拽到颜色 分析-合计-显示 ...
- array_filter()用法
第一种情况: 通过函数,过滤数组中的元素 array_filter($arr,'函数名称') 函数里可以写相应的过滤原则,下面举个栗子,过滤掉不是数字的元素 $arr=array('a','b','c ...
- CF24B F1 Champions 题解
Content 有 \(n\) 场已经进行完的赛车比赛,每场比赛给出前 \(m\) 名的名字.在每场比赛中,前 \(10\) 名的选手分别可以获得 \(25,18,15,12,10,8,6,4,2,1 ...
- Java高级:条件队列与同步器Synchronizer的原理+AQS的应用
14.构建自定义的同步工具 类库中包含了许多存在状态依赖性的类,例如FutureTask,Semaphore和BlockingQueue等.在这些类中的一些操作中有着基于状态的前提条件,例如,不能从一 ...
- .net 程序通过 crontab 无法启动,手动执行脚本可以启动
一.问题描述 .net 网关程序需要设置定时重启,按照日常操作先把正在运行的 PID kill 掉后,再执行启动服务. 把脚本放到 crontab 计划任务上,可以把服务 PID kill 掉,但无法 ...