`

1、java内存结构

阅读更多

一、理解

 

  • Java程序在运行时,需要在内存中分配空间。
  • 为了提高运算效率,又对空间进行了不同区域的划分,
  • 因为每一片区域都有特定的处理数据方式和内存管理方式

二、栈内存(JavaStack)

 

    用于存储局部变量(包括基本数据类型变量和对象的引用变量),当数据使用完,所占空间会自动释放

 

  • 引用变量是普通的变量,定义时在栈中分配
  • 在程序运行到其作用域之外后被释放
  • 而数组和对象本身在堆中分配,
  • 即使程序 运行到使用 new 产生数组或者对象的语句所在的代码块之外,
  • 数组和对象本身占据的内存不会被释放,
  • 数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,
  • 在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是 Java 比较占内存的原因。

三、堆内存(Heap)

 

    存储数组和对象,通过new建立的实例都放在堆内存中

 

  • 每一个实体都有内存地址值
  • 实体中的变量都有默认初始化值
  • 实体不再被使用,会在不确定的时间内被垃圾回收器回收

三、方法区(MethodArea)也叫共享区,数据区

 

    存储被虚拟机加载的类信息(类名、访问修饰符、字段描述、方法描述等)、常量、静态变量、即时编译器编译后的代码等数据

 

  • 常量池(constant pool): 常量池就是该类型所用到常量的一个有序集和
  • 除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)
    还包含一些以文本形式出现的符号引用,
  • 比如:类和接口的全限定名,字段的名称和描述符,方法和名称和描述符
  • 虚拟机必须为每个被装载的类型维护一个常量池。
  • 对于String常量,它的值是在常量池中的。
  • 而JVM中的常量池在内存当中是以表的形式存在的
  • 对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,
  • 注意:该表只存储文字字符串值,不存储符号引 用。
  • 在程序执行的时候,常量池 会储存在Method Area,而不是堆中。

四、本地方法区(Nativemethodstack)

 

五、寄存器

 

六、栈和堆

 

1,Java的堆是一个运行时数据区,类的对象从中分配空间。

 

  • 这些对象通过new、newarray、 anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。
  • 堆是由垃圾回收来负责的
  • 堆的优势是可以动态地分配内存 大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的
  • Java的垃圾收集器会自动收走这些不再使用的数据。
  • 缺点是,由于要在运行时动态 分配内存,存取速度较慢。

2,栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。

 

  • 缺点是,存在栈中的数据大小与生存期必须是 确定的,缺乏灵活性。
  • 栈中主要存放一些基本类型的变量数据(int, short, long, byte, float, double, boolean, char)和对象句柄(引用)。
  • 栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
    int a = 3;
    int b = 3;
  • 编译器先处理int a = 3;
  • 首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。
  • 接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。
  • 这样,就出现了a与b同时均指向3的情况。
  • 这时,如果再令 a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;
  • 如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响 到b的值。
  • 要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,
  • 因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。
  • 而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。

七、String是一个特殊的包装类数据

 

String str = new String("abc");
String str = "abc";

 

  • 可以用着两种形式来创建
  • 第一种是用new()来新建对象的,它会存放于堆中。每调用一次就会创建一个新的对象。
  • 第二种是先在栈中创建一个对String类的对象引用变量str,
    然后通过符号引用去字符串常量池 里找有没有"abc",
    如果没有,则将"abc"存放进字符串常量池 ,并令str指向”abc”,
    如果已经有”abc” 则直接令str指向“abc”。
  • 用第二种方式创建多个”abc”字符串,在内存中 其实只存在一个对象而已.
    这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,
    因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。
  • 而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
  • 另 一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,
    总是想当然地认为,创建了String类的对象str。
    担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。
分享到:
评论

相关推荐

    Java内存结构

    "Java内存结构" Java内存结构是Java编程语言中的一种基本概念,它决定了Java程序的运行机制。Java内存结构可以分为六个部分:寄存器、栈、堆、静态存储、常量存储和非RAM存储。其中,堆和栈是Java程序运行时最重要...

    Java内存结构.pdf

    ### Java内存结构详解 #### 一、概述 Java内存模型主要分为以下几个部分:堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(Program Counter Register)以及本地方法栈(Native Method Stack)。本文...

    Java 内存结构备忘录1

    Java 内存结构备忘录 Java 内存结构是一个复杂的系统,包括堆内存模型、垃圾回收算法和处理内存泄露的最佳方案。Java 虚拟机(JVM)中存在 PermGen(内存永久保存区域), PermGen 中存储了常量池、字段与方法数据...

    java内存机制及异常处理

    Java内存机制是Java虚拟机(JVM)的关键组成部分,它管理着程序运行时的数据存储。在Java中,内存主要分为以下几个区域: 1. **Heap(堆)**:这是Java中最主要的内存区域,用于存储所有的类实例和数组。当堆空间...

    Java虚拟机 JVM 内存结构介绍

    Java虚拟机(JVM)内存结构是理解Java应用程序性能和内存管理的关键。本文将详细介绍JVM内存的不同组件,包括它们的功能和重要性。 首先,Java虚拟机规范中的内存管理主要涉及Runtime Data Area,这是一个用于存储...

    Java内存机制学习和使用

    ### Java内存机制学习和使用 #### 一、Java内存机制概览 Java内存管理是Java开发人员必须掌握的核心概念之一。良好的内存管理不仅能够提升应用性能,还能避免常见的内存泄漏问题。本文旨在深入探讨Java内存机制,...

    jProfiler7 java内存分析 linux版本

    本篇文章将详细探讨jProfiler7在Java内存分析上的核心功能、使用方法以及在Linux环境中的配置和应用。 1. **内存分析概述** - 内存分析是识别和解决Java应用程序中的内存泄漏、过度对象创建和内存消耗过高问题的...

    JVM内存结构、Java内存模型、Java对象模型1

    Java内存模型(JMM)与JVM内存结构不同,它是针对多线程环境下内存访问的抽象模型。JMM确保在多线程环境下,共享变量的读写操作具有正确的顺序和可见性,通过volatile、synchronized等关键字来实现这一目标。JMM关注...

    一套完整介绍java内存模型和内存结构的文档

    #### 二、Java内存结构概述 Java程序在运行时,其内存空间被划分为多个不同的区域,以满足不同的数据管理和计算需求。下面详细介绍这些内存区域: 1. **程序计数器(Program Counter Register)** - **定义**:这是...

    JVM内存结构.zip

    Java内存模型定义了线程如何访问和修改共享变量,确保多线程环境下的正确性。它涉及到 volatile、synchronized、final 等关键字的语义。 理解并掌握JVM内存结构有助于我们编写高效、稳定的Java代码,避免出现性能...

    java虚拟机的内存结构

    java虚拟机的内存结构,关于内存的相关介绍等,想要了解更多JVM的

    JAVA内存溢出详解.doc

    1. **Java内存结构** Java内存主要分为堆内存(Heap)和栈内存(Stack),堆是存储对象实例的主要区域,而栈主要用于存储基本类型和对象引用。除此之外,还有方法区(Method Area)、程序计数器(PC Register)和...

    msJavaCoder#msJava#理解JVM内存结构与Java内存模型1

    JVM内存结构Java 代码是要运行在虚拟机上的,而虚拟机在执行 Java 程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。如果

    Java内存泄露检测

    Java内存泄露检测是Java开发中一个关键的议题,因为它直接影响到程序的稳定性和资源效率。内存泄露是指程序中已分配的内存无法被正确地释放,从而导致系统资源的浪费和可能导致程序性能下降甚至崩溃。 首先,理解...

    java内存分析-内存泄露问题.rar

    Java内存分析是一个重要的主题,尤其是在开发复杂且性能要求高的应用程序时。内存泄露是Java程序员需要密切关注的问题,因为它们可能导致系统性能下降,甚至可能导致系统崩溃。本文将深入探讨Java内存分析和内存泄露...

    java内存分配情况

    Java内存分配主要涉及五个区域:寄存器、栈、堆、静态域和常量池。在Java编程中,理解这些内存区域的分配规则对于优化代码性能和避免内存泄漏至关重要。 1. **寄存器**:这是最快捷的存储区域,但不在Java程序员的...

    JAVA内存结构-GC-CLASSLOAD

    【JAVA内存结构】 Java内存结构主要分为五个主要区域:堆(JAVA HEAP)、虚拟机栈(JAVA VIRTUAL MACHINE STACKS)、本地方法栈(NATIVE METHOD STACK)、方法区(METHOD AREA)和程序计数器(RUNTIME CONSTANT ...

    深入理解 Java 内存模型

    1. **内存层次结构**:Java 内存模型将内存分为堆内存、栈内存、方法区(在 Java 8 及以后版本中被元空间替代)和程序计数器等几个区域,其中堆存储对象实例,栈存储局部变量,方法区存储类信息,程序计数器则用于...

Global site tag (gtag.js) - Google Analytics