java你可能不知道的事(2)–堆和栈

在java语言的学习和使用当中你可能已经了解或者知道堆和栈,但是你可能没有完全的理解它们。今天我们就一起来学习堆、栈的特点以及它们的区别。认识了这个之后,你可能对java有更深的理解。

Java堆内存(Heap Memory)

堆内存在Java运行时主要去回收对象和JRE的类。当我们创建了一个对象(也就是 new一个对象),在堆内存就会为对象分配一个空间,Java垃圾回收器(GC)运行在堆内存里,一旦发现没有任何地方引用到这个对象,就释放这个对象所占的内存。
被创建的对象存在于堆内存,并且拥有全局权限,能被应用的任何地方引用到。

Java栈内存(Stack Memory)

堆内存是单线程执行的,它的空间比堆内存空间要小。它里面会包括定义在方法里的、短时间存在的局部变量,这些局部变量总是引用到堆内存的对象。堆内存还有个特点就是后进先出。当一个方法被调用之后,在栈内存就会为这个方法产生一个内存区域来保存方法里的基本数据类型数据和引用了堆内存中对象的局部变量。当这个方法执行完毕,这个块没有用了,就会被垃圾回收器回收,接着继续下一个方法。

加深理解

先来看一段简单的代码

<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> TestMemory {

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {
        <span class="hljs-keyword">int</span> i = <span class="hljs-number">666</span>;
        Object <span class="hljs-keyword">object</span> = <span class="hljs-keyword">new</span> Object();
        TestMemory testMemory = <span class="hljs-keyword">new</span> TestMemory();
        testMemory.test(<span class="hljs-keyword">object</span>);
    }

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">test</span>(Object <span class="hljs-keyword">params</span>){
        String str = <span class="hljs-keyword">params</span>.toString();
        System.<span class="hljs-keyword">out</span>.println(str);
    }
}

下面这张图片展示了上面代码的内存信息。

java你可能不知道的事(2)--堆和栈

1、当程序运行时,JVM会先加载运行时的类和我们自己写的类信息,这些类信息加载后存在堆内存当中。

2、接着进入到main方法,第一行line1创建了一个基本数据类型i=666,所以创建了一个main方法的内存块,它里面同时存放了i=666;

3、接着line2和line3的位置
Object object = new Object();
TestMemory testMemory = new TestMemory();创建了两个局部变量,object和testMemory,同时在堆里存放了两个新的对象Object和TestMemory。(每次我们new 一个对象都会在堆区产生一块内存区给它分配空间)。同时object和testMemory引用了new出来的对象。

4、现在到了line4,test方法了,当调用到test方法的时候,在栈的顶层创建了一块test()方法的内存区( 我们说过栈的特点就是后进先出),由于在 Java里的传递是值传递,所以就有了参数object产生了一个新的引用。

5、最后调用了toString产生了一个字符串常量存放在了String pool里,并且str 引用了它。(如果你有String类感兴趣,你可能喜欢 》Java你可能不知道的事系列1_String类

6、当test方法结束,它里面的变量也就被GC回收掉了。接着main方法也就结束。Java在运行时释放这些内存并结束程序的运行。

总结

1、当一个对象被创建,总是会在堆内存为它分配空间并且存储,如果有赋值就会将变量引用到对象。而栈内存就是存放这些引用对象的局部变量。

2、栈内存的生命周期很短,而堆内存从程序执行开始到结束一只都需要工作。因为栈内存没当执行完一个方法,它们所占的内存区就会被释放。而堆内存里的对象只有在没有任何变量引用到它的时候才可能会被释放。

3、栈内存大小相比于堆内存非常小。但是它相对于堆内存又比较快。

Original: https://www.cnblogs.com/yangqiangyu/p/5383868.html
Author: So,Cool
Title: java你可能不知道的事(2)–堆和栈

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607944/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • rocketmq总结

    1:角色关系 2:顺序消息 消费消息的顺序要同収送消息的顺序一致,在 RocketMQ 中,主要挃的是局部顺序,即一类消息为满足顺序性,必须 Producer 单线程顺序収送,丏収…

    Java 2023年5月30日
    086
  • 图片在容器内水平垂直居中显示

    图片在容器内水平垂直居中显示 效果: .imgbox { border: 1px solid #dcdfe6; position: relative; width: 150px; …

    Java 2023年6月9日
    075
  • SpringBoot-swagger

    SpringBoot整合swagger SpringBoot-swagger 13.1 导入相关依赖 io.springfox springfox-swagger-ui 2.9.2…

    Java 2023年6月5日
    091
  • MyBatis架构分析

    我们都知道 Mybatis是一个非常小巧灵活的ORM框架,深受国内广大开发者的喜爱,我们知道它的出现某种程度是为了消除所有的JDBC代码和参数的手工设置以及结果集的封装问题;基于这…

    Java 2023年6月5日
    078
  • java中的List接口(ArrayList、Vector、LinkedList)

    java;gutter:true;public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(e…

    Java 2023年6月6日
    076
  • uboot常用命令及其使用

    ? 或者 help 第一次使用uboot,通过?查看所有帮助信息 ?cmd 或者 help cmd ? bootz #查看bootz命令的帮助信息 通过该命令查看某个cmd的帮助信…

    Java 2023年6月6日
    054
  • 解析协同办公“协同”为何意,数字化办公又如何轻松“破题”?

    “协同办公”这个词在我们的工作场上出现的几率非常高,但如果要问协同办公协同的到底是什么,是怎样协同的,相信很多人是回答不出来的。 偶然间想到这个问题,于是便…

    Java 2023年6月5日
    092
  • Nginx作为静态资源web服务

    一、CDN 1、定义: 内容分发的逻辑网络。 2、作用: CDN能做到传输延时的最小化。 CDN请求示意图如下: 二、静态资源需要配置的一些语法模块。 1、配置语法 –…

    Java 2023年5月30日
    082
  • Java学习-第一部分-第二阶段-第一节:面向对象编程(高级)

    面向对象编程(高级) 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 类变量和类方法(static) 类变量 类…

    Java 2023年6月16日
    075
  • 第三方百度网盘客户端 PanDownload、速盘、panlight

    PanDownload PanDownload是一款能够快速下载百度网盘内资源的强大工具。PanDownload能够无限速高速下载,满速下载百度云盘里的各种资源。而且PanDown…

    Java 2023年5月30日
    0161
  • J Spring Framework- Integration 集成

    Spring提供了使用多种技术实现远程访问支持的集成类。远程访问支持使得具有远程访问功能的服务开发变得相当简单, 远程方法调用(RMI)。通过使用RmiProxyFactoryBe…

    Java 2023年5月29日
    083
  • Nginx location匹配规则

    url匹配规则 = : 表示精确匹配后面的url ~ : 表示正则匹配,但是区分大小写 ~* : 正则匹配,不区分大小写 ^~ : 表示普通字符匹配,如果该选项匹配,只匹配该选项,…

    Java 2023年5月30日
    089
  • Maven-私服搭建与配置

    一、maven私服搭建 1.下载地址 https://help.sonatype.com/repomanager3/product-information/download/dow…

    Java 2023年6月9日
    080
  • SSM框架整合

    SSM项目整合 由于SpringMVC是Spring框架中的一个模块,所以SSM框架整合只需要进行Spring与Mybatis和SpringMVC和Mybatis之间的整合 1、导…

    Java 2023年6月5日
    0103
  • 2019 年软件开发人员必学的编程语言 Top 3

    AI 前线导读:这篇文章将探讨编程语言世界的现在和未来,这些语言让新一代软件开发者成为这个数字世界的关键参与者,他们让这个世界变得更健壮、连接更加紧密和更有意义。开发者要想在 20…

    Java 2023年6月15日
    080
  • Linux 定时任务调度

    定时任务调度 任务调度:是指系统在某个时间执行的特定的命令或程序 任务调度分类 系统工作:有些重要的工作必须周而复始的执行 个别用户工作:个别用户可能希望执行某些程序 cronta…

    Java 2023年6月5日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球