java的内存分配分为两种基本数据类型。和对象类型。对8类基本数据类型,直接在栈上分配。对于对象既在栈上分配,也在堆上分配,在栈上分配引用的地址,在堆上分配new出来的对象。通过栈上分配的地址找到堆上new出来的对象。这些基础知识基本上都很简单,其实通过java的内存分配。我们可以很清楚的理解java里面非常著名的垃圾回收机制。java的垃圾回收机制,只回收堆上面的内存。不回收栈上面空间。很多书上都说,java回收机制是通过判断堆上的对象是否被引用。是否是有栈上的句柄指向堆上的对象,如果没有。java就会自动回收。举一个网上内存溢出非常多的例子来说:
public class out{
public static void main(String args[]){
List v=new ArrayList();
for(int i=0;i<4000000;i++){
Object o=new Object();
v.add(o);
o=null;//强制释放内存
}
}
}
我个人认为。最后令o=null就已经释放了o在堆上占据的内存。我现在的疑问是v里面有4000000个 object,在add进去后。堆内存上肯定还存在4000000个object。我个人觉得最后一句o=null没有什么作用。本人做了个测试。在i=5089378时,内存溢出。如果我屏蔽最后那句o=null 时测试还是i=5089378时内存溢出。这好像证明最后那句强制释放内存没有啥作用。我现在最大的疑问是在list add进去对象后的内存分配情况。到底是怎样。本人非常疑惑。本人对于for循环里面new对象也有很大的疑问。
for(int i=0;i<4000000;i++){
Object o=new Object();
v.add(o);
}
如果你在程序里面写这样的语句:
Object o=new Object();
Object o=new Object();
Object o=new Object();
不用想肯定不会通过编译。但是在for循环里面 new无数个都可以。本人的理解就是for循环里面的循环new对象后,每次新new 的时候上个new出来就会被垃圾自动回收。但是这个引用还存在啊,这么会被自动回收了, 本人今天突然觉悟,发现自己想通了,原来是局部变量,和全局变量的原因。
-- 局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收;
在程序:
public class out{
public static void main(String args[]){
List v=new ArrayList();
for(int i=0;i<4000000;i++){
Object o=new Object();
v.add(o);
o=null;//毫无意义
}
}
}
o是局部变量,new出来后,在作用域内,在栈空间,和堆空间分配。当离开循环,再次进入下一次循环,生命周期结束。栈上的引用空间,立刻被回收。但是在堆空间,new 出来的对象
还被v以用,所以垃圾回收,不会回收,其实本人一直对最后那句o=null很不解。有什么必要吗,垃圾回收立刻回收了栈空间的数据,还有必要吗?画蛇添足。搞的我一直晕头转向。其实这个程序的内存溢出是,v里面放入了过多的object,而导致的溢出。并不是什么垃圾回收的问题。个人认为。呵呵!关于for循环里面new对象的问题,同样的道理,局部变量超过生命周期,自动回收,所以 不管你new多少个相同名称的对象,它在确定的时刻,只有一个引用在栈上。所以就不存在出现两个相同名称的引用。
分享到:
相关推荐
50.java内存分配.zip50.java内存分配.zip50.java内存分配.zip50.java内存分配.zip50.java内存分配.zip50.java内存分配.zip50.java内存分配.zip50.java内存分配.zip50.java内存分配.zip50.java内存分配.zip50.java...
Java 内存分配是理解Java程序性能和...理解Java内存分配对于编写高效、无内存泄漏的代码至关重要,同时也对诊断和解决性能问题有着深远的影响。通过深入了解这些概念,开发者能够更好地设计和优化他们的Java应用程序。
### Java内存分配机制详解 #### 一、引言 Java作为一种广泛应用的编程语言,其内存管理机制对于确保程序高效稳定运行至关重要。本文旨在详细介绍Java内存分配机制中的几个关键概念:寄存器、栈、堆、静态域、常量...
Java内存分配主要涉及五个区域:寄存器、栈、堆、静态域和常量池。在Java编程中,理解这些内存区域的分配规则对于优化代码性能和避免内存泄漏至关重要。 1. **寄存器**:这是最快捷的存储区域,但不在Java程序员的...
理解Java内存分配原理有助于优化程序性能,避免内存泄露等问题。 在JVM中,内存主要划分为以下几个区域: 1. **寄存器**:这是JVM内部的虚拟寄存器,用于存储快速存取的数据,但程序员无法直接控制。 2. **栈...
### Java内存分配原理精讲 #### 一、引言 Java作为一门广泛应用于企业级开发的语言,其内存管理和分配机制是其核心技术之一。本文旨在深入探讨Java内存分配的基本原理及其在不同内存区域的具体表现,帮助读者更好...
JAVA 中内存分配的问题是指 Java 程序在运行时如何在内存中存储数据的过程。Java 程序运行时有 6 个地方可以存储数据,它们分别是寄存器、栈、堆、静态存储、常量存储和非 RAM 存储,主要是堆与栈的存储。 栈...
Java 实现内存动态分配主要涉及Java内存模型以及内存管理机制,包括堆内存和栈内存的分配,以及垃圾回收等概念。下面将详细解释这些知识点。 1. **Java内存模型** Java程序运行时,内存分为堆内存(Heap)和栈内存...
"java内存分配演示程序"是一个用于理解Java内存模型和内存分配过程的项目。在这个课程设计中,你将深入学习Java如何在运行时为对象分配内存,以及垃圾收集器如何回收不再使用的内存。以下是关于Java内存分配的一些...
Java程序在运行时的内存分配是一个关键的概念,它关乎...理解并掌握这些Java内存分配的知识点,对于编写高效、稳定的Java程序至关重要。通过实践和深入学习,开发者可以更好地控制程序的内存使用,减少错误,提升性能。
Java内存分配原理是Java编程中的重要一环,它关乎到程序的性能、稳定性和资源管理。深入理解这一主题,能够帮助开发者编写出更高效、更稳定的代码。在Java中,内存分为堆内存、栈内存、方法区(在Java 8之后被元空间...
Java内存分配与管理是Java的核心技术之一,今天我们深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的...
### Java内存对象分配过程研究 #### 一、引言 Java作为一门强大的面向对象编程语言,在实际开发过程中,对象的创建及其内存管理是至关重要的环节。深入理解对象在内存中的分配过程不仅能够帮助开发者设计出更为...
### JAVA内存分配详解 #### 一、JAVA内存结构概述 Java程序在运行过程中涉及的内存主要包括以下几个部分: 1. **方法区(Method Area)** 2. **栈内存(Stack Memory)** 3. **堆内存(Heap Memory)** 4. **本地...
Java内存分配的核心机制是垃圾收集(Garbage Collection, GC),它负责自动回收不再使用的内存。Java提供了几种不同的垃圾收集器,如Serial、Parallel、Concurrent Mark Sweep (CMS) 和G1等,它们各有优缺点,适用于...
Java内存分配全面解析 Java程序在执行过程中,其内存分配主要涉及到JVM(Java Virtual Machine,Java虚拟机)的不同区域。这些区域包括寄存器、栈、堆、常量池、代码段和数据段。理解这些内存区域的工作原理对于...
理解Java内存分配和JVM工作原理对于开发高效、健壮的Java应用至关重要。开发者应避免内存泄漏,合理使用内存,充分利用JVM的垃圾收集机制,同时理解JIT编译的优化策略,以提高程序的运行性能。在开发过程中,使用...
### Java中堆内存与栈内存分配浅析 #### 一、引言 在Java编程语言中,内存管理是一项至关重要的技术。程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的...
### Java内存分配详解 #### 一、Java内存区域划分 Java程序在运行过程中涉及的内存主要分为两大类:栈内存和堆内存。 1. **栈内存**:主要用于存储局部变量,如基本数据类型变量(int、long、char等)以及对象的...