`

栈和堆-java程序驻留在内存中的位置

    博客分类:
  • java
 
阅读更多
       绝大数情况下(不知道还有哪些情况),java程序(方法、变量、对象)驻留在内存中的栈和堆上。

栈(堆栈):驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。

        创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象句柄,但Java对象并不放到其中。


堆:一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!



总结:

1.对象在堆上
2.局部变量在栈上
//以上是转载
//个人分析
3.每个线程都有自己的常量池(int pool,string pool,char pool)
分享到:
评论

相关推荐

    ibm-java-堆内存分析工具-heapanalyzer

    - **Java内存模型**:包括堆内存、栈内存、方法区、本地方法栈和程序计数器等部分。 - **垃圾回收(GC)原理**:了解如何自动回收不再使用的对象,以及不同垃圾收集器的工作机制。 - **内存泄漏**:理解内存泄漏...

    java内存泄露、溢出检查方法和工具归纳.pdf

    Java内存管理是一个关键的性能优化领域,特别是在大型的服务器端应用程序中。内存泄露和溢出是常见的问题,它们可能导致服务不稳定甚至崩溃。本篇主要讨论Java内存泄露和溢出的检查方法以及常用的工具。 首先,当...

    jca javacore分析工具

    - "jvm":指的是Java虚拟机,是Java程序运行的平台,负责执行字节码、内存管理、线程调度等。 - "javacore":本话题的重点,是Java应用程序出现问题时生成的日志文件,用于诊断问题。 - "heapdump":表示Java堆...

    JVM内存管理

    JVM(Java Virtual Machine)内存管理是Java编程中至关...理解JVM内存管理对于解决Java程序中的内存泄漏、性能优化以及避免OutOfMemoryError等问题至关重要。开发者应关注内存的合理分配和释放,以确保程序的高效运行。

    提高Java程序性能

    Java程序性能优化是一个重要的主题,尤其对于大型企业级应用,性能优化可以显著提升用户体验和系统效率。以下是一些关于如何提高Java程序性能的关键点: 1. **使用单例模式**:单例模式可以减少资源的创建和管理,...

    java典型的内存泄漏

    首先,Java的垃圾回收器负责自动管理内存,通过追踪从"根"对象(如栈中的对象、静态数据成员和JNI句柄等)可达的所有对象,标记并保留活动对象,释放其余无法访问的对象。然而,尽管GC减少了程序员对内存管理的直接...

    进程的内存监视.e.rar

    代码段存储程序的机器指令,数据段存储全局变量和静态变量,堆用于动态分配内存,而栈则处理函数调用和局部变量。 内存监视的主要目的是识别内存泄漏、性能瓶颈以及优化程序的内存使用。内存泄漏是程序错误地分配但...

    vmmap 观察jvm内存 监控jvm jvm线程

    在Java开发过程中,对JVM(Java虚拟机)的监控是至关重要的,它能帮助我们了解应用程序的运行状态,优化性能,以及及时发现并解决内存泄漏等问题。`vmmap`工具是Mac OS X系统中一个强大的内存分析工具,它可以用来...

    Java小知识点

    对象(通过 new 关键字创建的对象,new 的作用就是在堆中创建对象)、实例成员在堆中存放。字面常量存放在常量区。 Servlet Servlet 是在服务器上运行的小程序。一个 Servlet 就是一个 Java 类,并且可以通过...

    java面试宝典JAVA相关基础知识,j2ee,数据库等题目

    - 基本数据类型如`int`是直接存储在栈中,而封装类如`Integer`是对象,存储在堆中。`Integer`提供了额外的方法,如`compareTo()`,但相比`int`,创建和操作对象会消耗更多资源。在处理大量数据时,通常推荐使用`int...

    字节大佬总结的Java面试资料.pdf

    * 虚拟机栈(Java Virtual Machine Stack):每个线程都有一个虚拟机栈,用于存储当前方法调用的参数和局部变量。 * 本地方法区(Native Method Area):用于存储 native 方法的信息。 * 堆(Heap):用于存储Java...

    jprofiler_windows_5_2_1.zip

    内存溢出是Java程序运行时常见的问题之一,它发生在程序请求的内存超过了系统或虚拟机所能分配的量,可能导致程序崩溃或者性能急剧下降。JProfiler 5.2.1正是针对这种情况而设计的,它提供了直观的界面和丰富的功能...

    一个很不错的JAVA笔试题汇总

    - **基本数据类型**:如int、char等,它们的值直接存储在栈中,而引用类型如Integer则是对象的引用,存储在堆中。 3. **String与StringBuilder/StringBuffer的区别** - **String**:不可变,一旦创建就不能修改,...

    操作系统(内存管理)

    如您所见,在这个分配程序中,内存的释放使用了一个非常简单的机制,在固定时间内完成内存释放。分配内存稍微困难一些。以下是该算法的略述: 清单 5. 主分配程序的伪代码 1. If our allocator has not been ...

    Java程序员面试常问试题大全(122题)

    - **Servlet**:驻留在服务器内存中,多线程处理请求,性能高。 - **CGI**:每次请求启动新的进程,处理完请求后结束,效率低。 7. **集合框架**: - **ArrayList和Vector**:基于数组实现,支持随机访问,但...

    JAVA的面向对象编程课堂笔记.doc

    基本数据类型是直接存储在栈中,而封装类的对象存储在堆中,提供了一些额外的方法,如Integer的parseInt()。对于大量操作字符串的情况,String是不可变的,适合用于常量;而StringBuffer或StringBuilder在需要频繁...

    用于复现 OOM bug,模拟JVM调优经历-JVMTest.zip

    堆内存是Java对象的主要存储区域,分为新生代(Young Generation)、老年代(Tenured Generation)和永久代( Perm Generation,在Java 8及以后版本中被元空间(Metaspace)取代)。当新生代的Eden区无法分配新对象...

    JavaServlet和JSP教程

    4. **高效性**:Servlet被加载到内存中后会一直驻留在内存中,这样可以避免每次请求时都重新加载代码所带来的性能开销。 #### 三、Servlet的工作原理 1. **生命周期**:Servlet的生命周期包括初始化阶段、服务阶段...

    SolvingJ2EEMemoryProblems.pdf

    Wily Technology是一家专注于企业级Java应用性能监控和优化的公司,其产品和服务能够帮助开发者和运维人员快速定位和解决J2EE应用中的性能瓶颈,尤其是在内存管理和优化方面。通过深度的性能分析和实时监控,Wily...

Global site tag (gtag.js) - Google Analytics