Java内存分配

简介:

 通常Java内存分配会涉及到以下几个区域:

  • 寄存器:在CPU内部,通常开发人员不能通过代码来控制的部分,主要是有编译器自己来管理的
  • 栈:存放基本类型的数据和对象的引用,对象本身不存放在栈中,而是存放在堆中
  • 堆:存放对象,也就是通常在Java中new产生的数据
  • 静态区域:存放程序中定义的static的静态成员
  • 常量池:存放常量,如final定义的
  • 非RAM存储:硬盘等永久存储空间,如持久化对象等等

  对于理解Java中的内存分配主要是栈(stack)和堆(heap)内存

  1、栈——stack

  a、在栈中存放的是基本数据类型定义的变量以及对象的引用变量,比如:定义变量int a=3,b=3;定义对象引用String str ;HelloWorld hello;等这样的数据都是存放栈内存中

  b、栈中存放的数据是可以共享的,如:int a = 1 ; int b = 1 ;这里不会对数据1存储两次,第二次定义的变量b的值所指向的变量a定义时的值1,如果b=2,那它会先遍历栈中的所有数据是否有值1存在,如果没有,那么它将重新申请一块栈内存资源来存放值2

  c、栈的存取速度比堆要快,仅次于寄存器。

  d、栈中的内存是随着作用区域来回收的,当这个变量或者对象引用在这个作用范围的代码块执行结束之后就自动释放了

  缺点:存在栈中的数据大小与生存期必须是 确定的,缺乏灵活性。

  2、堆——heap

  a、堆内存是用来存放由new创建的对象和数组的

  b、堆中的内存大小是动态分配的,所以它是运行时内存,由Java GC自动回收。

  如:

  A a = new A();

  通常辨别栈内存和堆内存,对于如上的这个表达式,=左边的就是存放在栈内存中,=右边的就是存放堆内存中。A a就是存在在栈内存中的一个对象的引用,这个引用就是指向堆内存中的new A()。

  缺点:栈内存是运行到作用范围之外之后释放掉内存,而堆中的数组和对象,及时运行到所在的代码块之外,数组和对象本身占据的内存是不会被释放的,数组和对象在没有引用变量指向它时,就变为垃圾,不能再被使用,但仍旧占据着内存空间不放,在随后一个不确定的时间被垃圾收集器回收走。所以这就是Java比较占内存的原因。

  备注:实际上,栈中的引用变量指向堆中的new对象,就是java中的指针。









本文转自一米一阳光博客园博客,原文链接:  http://www.cnblogs.com/candle806/archive/2013/01/22/2871741.html  ,如需转载请自行联系原作者


相关文章
|
4月前
|
存储 缓存 安全
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
65 6
|
4月前
|
存储 Java 编译器
Java内存模型(JMM)深度解析####
本文深入探讨了Java内存模型(JMM)的工作原理,旨在帮助开发者理解多线程环境下并发编程的挑战与解决方案。通过剖析JVM如何管理线程间的数据可见性、原子性和有序性问题,本文将揭示synchronized关键字背后的机制,并介绍volatile关键字和final关键字在保证变量同步与不可变性方面的作用。同时,文章还将讨论现代Java并发工具类如java.util.concurrent包中的核心组件,以及它们如何简化高效并发程序的设计。无论你是初学者还是有经验的开发者,本文都将为你提供宝贵的见解,助你在Java并发编程领域更进一步。 ####
|
3月前
|
安全 Java 程序员
深入理解Java内存模型与并发编程####
本文旨在探讨Java内存模型(JMM)的复杂性及其对并发编程的影响,不同于传统的摘要形式,本文将以一个实际案例为引子,逐步揭示JMM的核心概念,包括原子性、可见性、有序性,以及这些特性在多线程环境下的具体表现。通过对比分析不同并发工具类的应用,如synchronized、volatile关键字、Lock接口及其实现等,本文将展示如何在实践中有效利用JMM来设计高效且安全的并发程序。最后,还将简要介绍Java 8及更高版本中引入的新特性,如StampedLock,以及它们如何进一步优化多线程编程模型。 ####
55 0
|
4月前
|
存储 算法 Java
Java内存管理深度剖析与优化策略####
本文深入探讨了Java虚拟机(JVM)的内存管理机制,重点分析了堆内存的分配策略、垃圾回收算法以及如何通过调优提升应用性能。通过案例驱动的方式,揭示了常见内存泄漏的根源与解决策略,旨在为开发者提供实用的内存管理技巧,确保应用程序既高效又稳定地运行。 ####
|
5天前
|
存储 IDE Java
java设置栈内存大小
在Java应用中合理设置栈内存大小是确保程序稳定性和性能的重要措施。通过JVM参数 `-Xss`,可以灵活调整栈内存大小,以适应不同的应用场景。本文介绍了设置栈内存大小的方法、应用场景和注意事项,希望能帮助开发者更好地管理Java应用的内存资源。
19 1
|
10天前
|
Java Shell 数据库
【YashanDB 知识库】kettle 同步大表提示 java 内存溢出
【问题分类】数据导入导出 【关键字】数据同步,kettle,数据迁移,java 内存溢出 【问题描述】kettle 同步大表提示 ERROR:could not create the java virtual machine! 【问题原因分析】java 内存溢出 【解决/规避方法】 ①增加 JVM 的堆内存大小。编辑 Spoon.bat,增加堆大小到 2GB,如: if "%PENTAHO_DI_JAVA_OPTIONS%"=="" set PENTAHO_DI_JAVA_OPTIONS="-Xms512m" "-Xmx512m" "-XX:MaxPermSize=256m" "-
|
3月前
|
存储 监控 算法
Java内存管理深度剖析:从垃圾收集到内存泄漏的全面指南####
本文深入探讨了Java虚拟机(JVM)中的内存管理机制,特别是垃圾收集(GC)的工作原理及其调优策略。不同于传统的摘要概述,本文将通过实际案例分析,揭示内存泄漏的根源与预防措施,为开发者提供实战中的优化建议,旨在帮助读者构建高效、稳定的Java应用。 ####
58 8
|
3月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
3月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
105 5
|
3月前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####

热门文章

最新文章