一、内存划分

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中对象的内存分配机制的更多相关文章

  1. Java 中数组的内存分配

    Java 中数组的内存分配 1.Java 程序在运行时,需要在内存中分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式. 2.数组基本概念 数组是 ...

  2. Java基础-对象的内存分配与初始化(一定要明白的干货)

    首先,什么是类的加载?类的加载由类加载器执行.该步骤将查找字节码(classpath指定目录),并从这些字节码中创建一个Class对象.Java虚拟机为每种类型管理一个独一无二的Class对象.也就是 ...

  3. Java中对象在内存中的大小、分配等问题

    Java创建一个对象的过程 是否对象指向的类已经加载到内存了 如果没有加载,就要经过load.linking(verification.preparation.resolution).initiali ...

  4. JAVA中堆栈和内存分配原理

    1.栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量 ...

  5. JAVA中堆栈和内存分配

    (一).栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或 ...

  6. JAVA中堆栈和内存分配详解(摘抄)

    在Java中,有六个不同的地方可以存储数据: 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存 ...

  7. Java中对象并不是都在堆上分配内存的

    转(https://blog.51cto.com/13906751/2153924) 前段时间,给星球的球友们专门码了一篇文章<深入分析Java的编译原理>,其中深入的介绍了Java中的j ...

  8. Java内存分配机制

    内存分配,主要指的是在堆上的分配, 一般的,对象的内存分配都是在堆上进行,但现代技术也支持将对象拆成标量类型(标量类型即原子类型,表示单个值,可以是基本类型或String等),然后在栈上分配,在栈上分 ...

  9. 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?(阿里面试)

    JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆.栈.方法区等介绍的比较清楚. 上图,是一张在作者根据<Java虚拟机规范(Java SE 8)>中描述的J ...

随机推荐

  1. oracle中分组中的ROLLUP和CUBE选项

    在进行多列分组统计时,如果直接使用GROUP BY子句指定分组列,则只能生成基于所有分组列的统计结果.如果在GROUP BY子句中使用ROLLUP语句或CUBE语句,除了生成基于所有指定列的分组统计外 ...

  2. Vue局部组件和全局组件

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. 【Spark】【RDD】从本地文件系统创建RDD

    练习作业 完成任务从文件创建三个RDD(math bigdata student) cd ~ touch math touch bigdata touch student pwd 启动Spark-sh ...

  4. shell脚本 查看cpu的温度

    一.简介 源码地址 日期:2018/8/24 介绍:查看主板上单个多核CPU中温度最高的一个内核 效果图: 二.使用 适用:centos6+ 语言:英文 注意:需要先安装lm_sensors,不支持虚 ...

  5. 一文详解 OpenGL ES 纹理颜色混合

    在OpenGL中绘制的时候,有时候想使新画的颜色和已经有的颜色按照一定的方式进行混合.例如:想使物体拥有半透明的效果,或者绘制叠加光亮的效果,这时候就需要用到OpenGLES混合. 如上图所示,为石头 ...

  6. glViewport()函数和glOrtho()函数的理解

    glViewport()函数和glOrtho()函数的理解     OpenGL中有两个比较重要的投影变换函数,glViewport和glOrtho. glOrtho是创建一个正交平行的视景体. 一般 ...

  7. 自动化测试环境搭建之Python3.6+selenium44+firefox

    推荐使用: Python3.6+selenium2.53.6+Firefox46以下 +[Chrome任意版本+对应版本webdriver] ----------------------------- ...

  8. LuoguP7059 [NWRRC2015]Lucky Chances 题解

    Content 有一个名叫 Lucky chances 的游戏,游戏一开始给出一个 \(r\times c\) 的矩阵,你可以选定矩阵中任意一个元素以及上.下.左.右四个方向中的任意一个方向进行游戏. ...

  9. 一、Uniapp+vue+腾讯IM+腾讯音视频开发仿微信的IM聊天APP,支持各类消息收发,音视频通话,附vue实现源码(已开源)-项目引言

    项目文章索引 1.项目引言 2.腾讯云后台配置TXIM 3.配置项目并实现IM登录 4.会话好友列表的实现 5.聊天输入框的实现 6.聊天界面容器的实现 7.聊天消息项的实现 8.聊天输入框扩展面板的 ...

  10. AcWing 1113. 红与黑

    1.题目描述 有一间长方形的房子,地上铺了红色.黑色两种颜色的正方形瓷砖. 你站在其中一块黑色的瓷砖上,只能向相邻(上下左右四个方向)的黑色瓷砖移动. 请写一个程序,计算你总共能够到达多少块黑色的瓷砖 ...