内存分配:
寄存器:是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。
栈 :存放基本数据类型和对象的引用,而对象本身却是存放在堆中的。
堆 :存放new出来的数据。
常量池:存放常量。
非RAM存储:硬盘等永久性存储空间。
栈:在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时,Java就在栈中 为这个变量分配内存空间,当该变量退出该作用域
后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
堆:堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管
理。
在堆中产生了一个数组或对象后,还可以 在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 引用变量就相当于是 为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序 运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是 Java 比较占内存的原因
常量池:指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。
在程序执行的时候,常量池是存储在方法区中,而不是堆中。
区别:
堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存 大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态 分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是 确定的,缺乏灵活性。栈中的基本数据可以共享,而和两个对象的指向同一个引用不同,因为基本类型是编译完成的。
概括:
栈中用来存放一些原始数据类型的局部变量数据和对象的引用(String,数组.对象等等)但不存放对象内容
堆中存放使用new关键字创建的对象.
字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定(常量池和堆).有的是编译期就已经创建好,存放在字符串常 量池中,而有的是运行时才被创建.使用new关键字,存放在堆中。
相关推荐
Spring框架作为Java领域的重量级选手,早已深入人心。然而,Spring并不仅仅局限于服务端开发,它也拓展到了移动领域,推出了Spring for Android。这个框架的核心部分便是我们今天要探讨的"spring-android-core-1.0.0...
它的核心组件是`javamelody-core`,正如我们所见的文件名"javamelody-javamelody-core-1.67.0.zip"所示。这个版本1.67.0包含了JavaMelody监控系统的最新特性和改进。 JavaMelody的主要功能在于提供实时的、详细的...
"Algorithm-java-core.zip"这个压缩包文件,正如其名,聚焦于Java编程语言中的核心算法和设计模式。Java作为一种广泛应用的面向对象编程语言,其强大的性能和可移植性使其在软件开发领域占据重要地位。而算法和设计...
总的来说,Java PathFinder-jpf-core是一个强大的工具,对于提升Java软件的质量和可靠性具有重要意义。它不仅提供了对代码的深入洞察,还为研究人员和开发者提供了一个平台,以研究和开发新的静态和动态分析技术。
Java Core,通常简称为javacore,是JVM生成的一种诊断报告,包含了JVM运行时的关键信息,如线程状态、堆内存使用、类加载信息等。当应用出现挂起、无响应等问题时,javacore可以帮助开发者快速定位问题所在。分析...
《JDK17-java-core-libraries-developer-guide》是一份针对Java开发者的指南,主要涵盖了Java标准版(Java SE)17的核心库。这个版本的发布号为F40864-03,发布时间为2022年10月。这份文档由Oracle公司及其关联公司...
8. **JVM**:理解JVM的工作原理,包括类加载、内存模型(堆、栈、方法区)、垃圾回收等,有助于优化程序性能和解决内存泄漏问题。 9. **设计模式**:设计模式是解决软件设计中常见问题的经验总结,如单例模式、工厂...
2. **理解日志结构**:javacore日志由多个部分组成,包括JVM概览、线程堆栈跟踪、类加载信息、内存区域分配等。每个部分都为诊断提供了关键信息。 3. **识别问题迹象**:内存溢出通常会在堆分配、永久代或元空间...
总结来说,面对Java IBM WebSphere的内存溢出问题,我们需要结合`javacore`和`deapdump`等诊断工具,通过分析脚本和相关库文件,理解内存管理原理,调整JVM配置,并优化代码,才能有效地排查和解决问题。
Jackson是Java领域广泛使用的JSON处理库,它的核心组件就是`jackson-core`。本文将深入探讨`jackson-core-2.9.3`版本,理解其功能、用法以及在处理JSON数据时的关键特性。 一、Jackson核心库介绍 Jackson-core是...
在Java开发领域,深入理解核心Java是任何程序员面试时不可或缺的知识。"Core Java Interview Questions"这个资源集锦了面试中可能会遇到的一些关键问题,旨在帮助求职者更好地准备Java核心技术的面试。以下是根据...
CoreJava是Java的基础,涵盖了Java Standard Edition (J2SE)的主要内容,包括基本语法、面向对象编程(OO)原则、核心类库的使用等。在学习CoreJava时,我们需要掌握以下几个关键知识点: 1. **编程思想**: - ...
Mahout可以与Hadoop生态系统中的其他工具(如HBase、Spark等)无缝集成,也可以与其他编程语言(如Java、Python)通过API交互,方便进行数据处理和模型构建。 综上所述,Mahout是一个强大的机器学习库,适用于处理...
从标题“javamelody-javamelody-core-src-1.68.1.zip”可以看出,这包含的是JavaMelody核心组件1.68.1版本的源代码。这对于开发者来说是一个宝贵的资源,可以深入理解其内部工作原理,进行定制化开发或者调试。 源...
在学习Core Java时,首先要理解以下几个关键知识点: 1. **类与对象**:类是面向对象编程的基础,是描述某一类事物共性的抽象,而对象是类的具体实例。类包含了属性(即对象的状态)和方法(对象的行为)。对象与类...
【Java核心知识详解】 ...在深入学习Core Java的过程中,不断地实践和理解这些知识点,将使你逐步成为一名熟练的Java开发者。记得不断探索和学习新的API、框架和技术,以适应Java生态系统的发展。
通过学习这本《Core Java》电子书,无论是初学者还是有经验的开发者,都能深化对Java语言的理解,提升编程技能。同时,书中可能还会涵盖一些高级主题,如并发编程、JavaFX GUI开发、数据库连接、JDBC等,为读者提供...
虽然CoreJava源码本身并不包含JVM的部分,但是通过分析源码,我们可以更直观地理解代码如何在JVM上运行,进而对内存管理、垃圾回收等有更深的认识。 十、设计模式 CoreJava的源码中融入了多种设计模式的应用,如...
总结来说,Jackson Core ASL和Jackson Mapper ASL是处理JSON数据的强大工具,它们在Java开发中扮演着重要角色,为JSON数据的解析、生成、序列化和反序列化提供了便利。通过理解这些组件及其功能,开发者可以更好地...
《核心Java 卷二:高级功能(第八版)》是一本经典的Java编程教材,由Prentice-Hall出版社出版,面向已经掌握了Java基础的开发者,深入讲解了Java的高级特性和应用。这本书涵盖了许多关键的Java技术,对于提升Java...