https://www.ibm.com/developerworks/cn/java/j-codetoheap/
http://javawebsoa.iteye.com/blog/1558776
http://zhidao.baidu.com/question/43842299.html
http://yshjava.iteye.com/blog/1327778
Java把内存划分成两种:一种是栈内存,一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 堆内存用来存放由new建立的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中运用栈中的引用变量来访问堆中的数组或对象。
Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等 指令建立,它们不须要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时 动态分配内存的,Java的垃圾收集器会自动收走这些不再运用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本 类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。 栈有一个很主要的特殊性,就是存在栈中的数据可以共享。
下面用例子说明上面的理论。
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true可以看出str1和str2是指向同一个对象的。
String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false用new的方式是生成不同的对象。每一次生成一个。
因此用第二种方式建立多个“abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定能不能有必要建立新对象。而对于String str = new String("abc");的代码,则一概在堆中建立新对象,而不管其字符串值能不能相等,能不能有必要建立新对象,从而加重了程序的负担。 另一方面, 要留心 : 我们在运用诸如String str = "abc";的格式定义类时,总是想当然地认为,建立了String类的对象str。担心陷阱!对象可能并没有被建立!而可能只是指向一个先前已经建立的 对象。只有通过new()要领才能保证每次都建立一个新的对象。 由于String类的immutable性质,当String变量须要经常变换其值时,应该考虑运用 StringBuffer类,以提高程序效率。
谁能比较系统、全面的描述下java内存分配、管理机制?让大家加深对已学基本概念、原理的理解,将零散的知识框架化。 主要涉及的问题:
java主要的三种内存结构-- 方法区、栈、堆分别适用于存储哪些类型的数据?在运行效率、数据共享、灵活性等方面各自的特点。
线程与这三者之间的联系?
多线程之间如何通过这三种存储结构共享数据? java反射的实现? 引用类型变量和对象具体在哪个存储结构中存储?如何分配内存? 局部变量和成员变量的内在区别? 定义基本类型数组和引用类型数组,初始化时,内存分配的区别? 什么情况下,将方法设计为静态化? 期待既系统又精炼的总结。 |
相关推荐
JAVA虚拟机内存分配与回收机制 JAVA虚拟机的内存分配与回收机制是JAVA语言的核心机制之一。该机制将内存划分为两种:栈内存和堆内存。 栈内存是用于存放基本类型的变量和对象的引用变量。在函数中定义的变量和对象...
JAVA虚拟机内存分配机制是Java程序执行过程中内存管理的核心部分,它涉及到程序的性能和效率。Java虚拟机(JVM)内存主要分为两大部分:栈内存和堆内存。 栈内存主要存储程序运行过程中的局部变量,包括基本类型...
Java虚拟机内存管理总结 Java虚拟机(JVM)中的内存管理是指Java语言中对象的分配和释放问题。Java中的内存管理可以分为两部分:对象的分配和释放。 对象的分配是由程序完成的,程序员需要通过关键字new为每个对象...
以下是对Java虚拟机内存模型的详细解读。 1. **程序计数器(Program Counter Register)** - 这是每个线程私有的内存区域,用于存储当前线程执行的字节码的地址,每次方法调用都会更新这个计数器,以便下一次知道...
Java虚拟机内存分配主要涉及到两种主要的内存区域:堆(Heap)和栈(Stack)。这两种内存区域在程序执行过程中有着不同的角色和管理策略。 栈内存主要用于存储基本类型变量(如int、float等)和对象的引用。在函数...
总结来说,基于Java虚拟机内存模型的性能调优涉及到多个层面,包括理解内存结构、垃圾回收机制、内存分配策略、调优工具的使用以及JVM参数的设置。通过深入理解和实践这些知识,开发者能够有效地优化Java应用程序,...
内存分配与回收策略, JVM 调优, 文件结构, 类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行。Java具有简单、...
Sun/Oracle JVM的内存管理机制包括垃圾收集、内存分配与回收策略等。优化方面,SUN/Oracle提供了多种优化技术,包括对JVM内存的优化,例如调整新生代和老年代的比例,选择合适的垃圾收集器等。 ##### 2.4 JVM内存...
根据提供的文件内容,以下是关于JAVA虚拟机(JVM)内存使用优化的知识点: 1. JVM内存优化的重要性:在运行Java应用程序时,尤其是涉及到大量数据查询和高并发操作的场合,系统可能由于内存溢出而不稳定。JVM内存...
Java虚拟机(JVM)是Java平台的核心组件之一,它提供了一个运行Java字节码的环境,并且负责管理Java程序的内存分配和垃圾回收。在本文中,我们将深入探讨Java虚拟机的体系结构、垃圾回收机制、Java对象的生命周期和...
了解这些内存区域的分配与回收机制,有助于避免内存泄漏和提高程序性能。 3. **垃圾收集与内存管理**:Java虚拟机中的垃圾收集机制是自动进行内存管理的关键。书里介绍了不同的垃圾收集算法(如标记-清除、复制、...
在Java虚拟机内存管理中,垃圾回收机制的存在经常被初级程序员所忽略,因为它自动管理内存的回收,但对高级程序员来说,理解内存管理的原理和机制是必须的。 首先,我们需要了解JVM内存结构。JVM内存主要分为堆内存...
### JAVA虚拟机的内存管理详解 #### 一、引言 在Java 2平台的强大支持下,J2SE能够自动管理内存,这大大减轻了开发者的负担,让他们不必再进行复杂的显式内存管理工作。本文档旨在对Sun J2SE 5.0版本中的Java ...
3. **垃圾收集与内存管理**:JVM负责自动管理内存,包括对象的分配和回收。垃圾收集器是其重要组成部分,通过标记-清除、复制、标记-整理和分代收集等多种算法来释放不再使用的内存。 4. **类加载过程**:类的生命...
标准参数通常涉及JVM的内存分配、垃圾回收机制等;非标准参数则涉及到JVM的内部细节和特定功能的开启关闭。 1. **内存配置参数**: - `-Xms` 和 `-Xmx`: 分别用于设定JVM的初始堆内存和最大堆内存。例如,`-Xms256...
本文主要分析了Java虚拟机的内存管理,特别是垃圾回收机制及其实现。 首先,Java虚拟机中的内存主要分为堆内存和栈内存。堆内存主要存储程序运行时创建的对象实例,而栈内存则用于存放程序中的静态或非静态方法调用...
Android的JAVA虚拟机负责内存分配和回收,防止内存泄漏。Dalvik和ART都实现了垃圾回收机制,自动回收不再使用的对象所占用的内存。这使得开发者无需手动管理内存,专注于应用程序的逻辑开发。 5. **多线程与并发**...
《Java虚拟机规范》是Java技术的核心文档之一,它详细描述了Java虚拟机(JVM)的行为,包括其内部结构、数据类型、执行模型、指令集、运行时数据区、垃圾回收机制和安全管理等内容。该规范是Java平台实现的基石,对...
总的来说,《自己动手写Java虚拟机(GO语言)》是一本结合理论与实践的优秀教材,适合对JVM感兴趣的开发者,尤其是那些希望深入理解Java平台内部运作的Go语言爱好者。通过阅读和实践,读者将能够更全面地掌握JVM的...