java学会这些,我就入门啦!(基础篇一)栈与堆

简介: java学会这些,我就入门啦!(基础篇一)栈与堆

        最近有比较多的粉丝说想学习java,或者正在上学,或者刚开始培训,或者在面试,希望我整理出一份可以在空闲的时候看的干货!!

       下面,你们要的干货来了,一篇就是一个知识点,可以随时随地打开手机看看,面试,学习必备。关注我哦!

a79fc906e88435af50b2c5c9e509bbfb_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

所有的java程序在运行时,都要在内存中开辟一个空间,并且在JVM(java虚拟机)运行的时候,会分得更加的细致,虚拟机中每一片内存的处理方式都是不一样的,所以需要进行单独的管理。


JVM的内存一共分为5种:

寄存器,本地方法区,方法区,堆内存,栈内存


今天我们主要讲堆内存与栈内存。


栈内存

栈内存主要储存的是局部变量,也就是说,是定义在方法之内的,都叫局部变量。线程执行的时候调用方法的内存模型,当方法执行的时候,会创建一个叫“栈帧”的内存结构,栈帧会储存该方法内用到的局部变量表,操作数栈、返回地址、动态连接等信息。(这里新手主要了解局部变量表与返回地址就好了,局部变量表顾名思义是用来储存局部变量的,方法返回地址,是指方法在运行过程中,可能会正常退出,也可能会异常退出,但是不管哪种退出方式,都要让调用者知道方法退出的位置,方法返回地址就是用来确定退出位置的。)一个方法从方法被调用开始,到方法执行结束,就是一个栈帧在java栈中从入栈到出栈的全过程。


堆内存

堆内存储存的是对象,也就是new出来的都在堆里,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。


通俗一点说堆和栈的区别:堆主要用来存放对象的,栈主要用来执行程序的。


那么栈和堆有什么不同呢,我们可以从几个方面看待他们的不同!

       顺序

   栈是先进后出,堆是先进先出

缓存

   栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;

   堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

内存回收:

   栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

申请效率:

   栈:由系统自己分配,速度较快,但是程序员无法掌握。

   堆:一般有两种方法来申请内存,new和malloc,new是一种用算符而malloc是函数。由程序员申请出来的内存一般速度比较慢,而却容易产生内存碎片,不过用起来比较方便,获取的空间大,也相对较灵活。

cf9a30253a89e68f08ff628bc7c2f460_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

       每天抽出空闲的时间多看一点点。相信我,你会变得更强。


相关文章
|
27天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第17天】本文详细介绍了Java编程中Map的使用,涵盖Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的并发处理和性能优化技巧,适合初学者和进阶者学习。
40 3
|
19天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
6天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
12天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
18天前
|
存储 安全 Java
🌟Java零基础-反序列化:从入门到精通
【10月更文挑战第21天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
56 5
|
15天前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
29 1
|
22天前
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
43 3
|
22天前
|
存储 算法 Java
🧠Java零基础 - Java栈(Stack)详解
【10月更文挑战第17天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
16 2
|
23天前
|
Java
Java中的多线程编程:从入门到精通
本文将带你深入了解Java中的多线程编程。我们将从基础概念开始,逐步深入探讨线程的创建、启动、同步和通信等关键知识点。通过阅读本文,你将能够掌握Java多线程编程的基本技能,为进一步学习和应用打下坚实的基础。
|
25天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第19天】本文介绍了Java编程中重要的数据结构——Map,通过问答形式讲解了Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的使用和性能优化技巧,适合初学者和进阶者学习。
42 4