首先声明一下,这篇文章不属于完全原创,参考了下面这位博主的一篇博文:
蛊惑Into:http://www.cnblogs.com/whgw/archive/2011/09/29/2194997.html
我只总结一下重要的,需要的理解的点就OK了,其它的,至少现在我不太会强求自己去理解;
①定义:
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存
栈内存:
一些基本类型的变量和对象的引用变量都是在栈内存中分配。当在一段代码块中定义一个变量时,
java就在栈中为这个变量分配内存空间,当超过变量的作用域后,jvm会自动释放掉为该变量
分配的内存空间,该内存空间可以立刻被另作他用。
堆内存:
用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。
在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者
对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在
程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个
别名,或者代号。
引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因;
PS:
按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的.
静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求.
栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。
静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放.
堆主要用来存放对象的,栈主要是用来执行程序的.
相关推荐
5. **调试器**:Eclipse的Java调试器提供了强大的断点、变量查看、调用堆栈分析等功能,使得复杂程序的调试变得直观和简单。 6. **集成测试框架**:Eclipse支持JUnit和TestNG等测试框架,便于编写和执行单元测试,...
在本项目中,“java堆栈的应用--中缀表达式转换成后缀表达式和计算”具体涉及到了两个主要知识点:中缀表达式的转换与后缀表达式的计算。 1. **中缀表达式**:这是我们常见的数学表达式形式,如 `2 + 3 * 4`,其中...
### Java基础知识总结 #### Java 入门概述 Java 作为一种广泛应用的编程语言,自1995年由 Sun Microsystems 发布以来,迅速成为了软件开发领域的主流技术之一。Java 的诞生不仅推动了软件行业的进步,还引领了一...
4. **其他开发工具**:OpenJDK 1.8.0还包括其他的开发工具,如`jmap`用于内存映射,`jhat`用于分析堆转储,`jinfo`获取Java配置信息,`jstack`用于查看线程堆栈跟踪,以及`jconsole`图形化监控工具等。这些工具对于...
在上述示例中,我们简单地打印了异常堆栈轨迹,实际应用中可能需要更具体的错误处理逻辑。 除了基本的JDBC操作,还可以使用诸如Hibernate、MyBatis等ORM框架,它们提供了更高级别的抽象,简化了数据库操作,使代码...
本篇将详细解析"Eclipse IDE for Java Developers",即2021年9月发布的版本,具体文件为“eclipse-java-2021-09-R-linux-gtk-x86_64.tar.gz”,针对Linux x86_64架构的系统。 首先,Eclipse Java版是专为Java开发者...
Java 1.8.0 OpenJDK 1.8.0.222-2 是一个针对Windows x64平台的开源Java开发工具包,它提供了完整的Java开发环境,包括Java虚拟机(JVM)、Java类库以及用于构建和运行Java应用程序所需的其他组件。这个版本的OpenJDK...
Java基础是每一个Java开发者必须掌握的核心知识,而JVM(Java虚拟机)作为Java程序运行的平台,它的理解和使用对于优化程序性能、排查问题至关重要。本篇内容将深入探讨Java基础中的JVM初步使用,帮助你更好地理解...
本文将深入探讨标题所提及的三个实用脚本:“show-busy-java-threads”、“show-duplicate-java-classes”以及“find-in-jars”。这些脚本都是针对Java开发者和系统管理员的利器,旨在提高效率和解决问题。 1. **...
本课程由IT十八掌徐培成讲解的"Java基础第04天-04.OOP-堆栈的溢出与设置-private关键字"深入探讨了两个关键主题:堆栈溢出和private关键字的使用。 首先,让我们来理解堆栈溢出。在计算机编程中,内存分为堆和栈两...
这个简单的JAVA-JAIN-SIP客户端示例展示了如何利用该库与SIP服务器进行交互,实现登录和发起呼叫的基本功能。SIP是一种互联网协议,常用于多媒体通信,如VoIP电话、视频会议等。 首先,我们要理解JAIN SIP(Java ...
`show-busy-java-threads.sh`脚本通过JVM提供的命令行工具`jstack`来获取当前Java进程的线程堆栈信息,从而揭示这些繁忙线程的详细状态。 `jstack`是Java标准工具包(JDK)的一部分,它能输出Java虚拟机(JVM)中...
4. **开发工具**: JDK附带了一系列用于开发和调试Java应用的工具,如javadoc(生成API文档),jconsole(监控Java应用),jmap(内存映射工具),jstack(线程堆栈跟踪)等。 5. **Java语言特性**: Java 8引入了...
【Java面试资料】-(机构内训资料)上海-拼多多-Java高级 这份资料是针对Java高级开发人员的面试准备,特别关注于拼多多这家知名电商公司的面试需求。它涵盖了Java编程语言的核心概念、高级特性以及在实际开发和...
了解这些基础知识对于优化Java应用程序性能至关重要。合理地分配和管理内存,可以避免内存泄漏,提高程序运行效率。同时,理解堆栈的工作机制也有助于调试和解决运行时错误。因此,深入学习和理解Java堆栈对于每一个...
MySQL是世界上最受欢迎的关系型数据库管理系统之一,而`mysql-connector-java-5.1.30`是MySQL官方为Java开发者提供的数据库连接驱动包。这个驱动包使得Java应用程序能够与MySQL数据库进行无缝通信,执行SQL查询,...
"CC++Java笔试题--很多大公司的面试和笔试题目-珍贵"这个压缩包文件很可能包含了这些语言的基础知识、进阶概念以及实际问题的解题策略,这些都是求职者在准备面试和笔试时需要掌握的重点。 C语言是基础,它的特点是...
堆栈实现数字转换(范围:2-16进制)!!!!!!!!!
下面我们将详细讨论如何在Java中实现堆栈,并探讨其相关知识。 首先,我们可以通过自定义一个类来实现堆栈。基本的堆栈操作包括压栈(push)、弹栈(pop)、查看栈顶元素(peek)和检查堆栈是否为空(isEmpty)。...