logo头像
Snippet 博客主题

【JavaSe必知必会】22-Java对象内存分析

Java中的内存分配

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

  • 栈 存储局部变量
    • 局部变量 在方法定义中或者方法声明上的变量都称为局部变量,使用完毕,立即消失
  • 堆 存储new出来的东西

    • 每一个实体都有首地址值
    • 每一个实体内的数据都有默认值

      byte,short,int,long 0

      float,double 0.0

      char ‘\u0000’

      boolean false

      引用类型:null

    • 使用完毕后,会被垃圾回收器空闲的时候回收。
  • 方法区 被虚拟机加载的类信息、常量、静态常量等。
  • 本地方法区 (和系统相关)
  • 寄存器 (给CPU使用)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
class Phone{
//品牌
String brand;
//价格
int price;
//颜色
String color;

//打电话
public void call(String name){
System.out.println("给"+name+"打电话");
}

//发短信
public void sendMessage(){
System.out.println("发短信。。。");
}

//玩游戏
public void playGame(){
System.out.println("王者荣耀carry中。。。");
}
}

class PhoneDemo{
public static void main(String[] args){
//使用前需要创建对象
//类名 对象名 = new 类名();
Phone p = new Phone();

System.out.println(p.brand+"==="+p.price+"==="+p.color);

//给成员赋值
p.brand = "iPhone X";
p.price = 6888;
p.color = "黑色";
System.out.println(p.brand+"==="+p.price+"==="+p.color);

//调用方法
p.call("呆萌钟");
p.sendMessage();
p.playGame();

System.out.println("------------------------");

Phone p2 = new Phone();

System.out.println(p2.brand+"==="+p2.price+"==="+p2.color);

//给成员赋值
p2.brand = "锤子";
p2.price = 2299;
p2.color = "红色";
System.out.println(p2.brand+"==="+p2.price+"==="+p2.color);

//调用方法
p2.call("迪丽热巴");
p2.sendMessage();
p2.playGame();
System.out.println("------------------------");
Phone p3 = p;
System.out.println(p3.brand+"==="+p3.price+"==="+p3.color);

//给成员赋值
p3.brand = "华为";
p3.price = 1999;
p3.color = "蓝色";
System.out.println(p3.brand+"==="+p3.price+"==="+p3.color);
System.out.println(p.brand+"==="+p.price+"==="+p.color);

}
}

一个对象的内存图

image

两个对象的内存图

image

三个对象的内存图

image

微信打赏

赞赏是不耍流氓的鼓励