(一)JVM内存管理——从“==”和“equals”讲起

引子

一段简单的代码结果引发疑问,==到底比较的是什么?equals呢?

 public static void main(String args[]){
        String s1="abc";
        String s2="abc";
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));

        String s3=new String("abc");
        System.out.println(s1==s3);
        System.out.println(s1.equals(s3));
}

运行结果是

true

true

false

true

如果等号比较的是引用的内容,那么s1==s3的结果并非预期的那样;如果等号单纯比较引用是否相等,为什么s1==s2?

解释

1)等号确实比较的只是单纯的引用是不是相等的;也就是这两个引用指向的是不是同一个地址

2)equals类型仅用于类,它比较的是类中的内容是否相等

String类型是最简单,最适合举例的类

我们可以明白,s1,s2指向的同一个地方,但s1和s3是不同地方

JVM内存模型

事实上,所有的int a=3; String a="abc";它们的对象(姑且理解成内容或者值)都被存在了一个叫运行时常量池的地方

这个地方的好处就是每当存储变量时,会检测运行时常量池中是否有和它相等的变量;如果有,就把引用直接指向那个变量

所以上面例子中的s1和s2,是指向运行时常量池的同一块

那么s3呢?这时它完全按照类的模式初始化,所以它的值也被存在了Java堆

一、虚拟机栈

类似于Windows中的栈,每个线程都有自己独享的栈,用来存放运行时局部所需要的东西

String s3=new String("abc"); 其中的s3这个引用,被存在了虚拟机栈中

二、程序计数器

记录JVM将要运行的下一条指令(字节码形式)的地址

Java编译的时候首先生成.java文件,也就是字节码形式

三、本地方法栈

在java程序运行C语言函数时会用到

四、堆

所有非静态对象都在此分配并保存;这个区域是所有线程公有的

五、方法区

所有的静态变量都保存在这里和运行时需要的常量——简单数据类型和inal类型的一些数据——运行时常量池

内存区域特点

1)虚拟机栈、本地方法栈、程序计数器都是线程独有的;堆和方法区是所有线程公有的

2)JVM在做垃圾回收的时候只针对堆;方法区是从来不动的,所以又称作永久代

3)而垃圾回收时会将堆分成两部分;年轻代和年老代

4)除了程序计数器,其他四块都会OutofMemory

后记

这一篇只是引子,讲得比较感性;求得只是一个理解

真正实践中还是需要更多代码啊~

请继续关注

(二)JVM内存管理——从强引用弱引用看垃圾回收

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值