1. 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收。
2. 引用数据类型,需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量 。
3. 方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完成后从栈空间回收。
4. 局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收。
5. 方法调用时传入的 literal 参数,先在栈空间分配,在方法调用完成后从栈空间分配。数组既在栈空间分配数组名称, 又在堆空间分配数组实际的大小
6. static,字符串常量在 DATA 区域分配 ,this 在堆空间分配 。
7.每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.
8.Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。
9.堆区:
存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
10.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
11.栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
12.堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
13.一种是基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char(注意,并没有string的基本类型)。存的是字面值,存在于栈中。
14.栈有一个很重要的特殊性,就是存在栈中的数据可以共享。
15.包装类数据,如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中,Java用new()语句来显示地告诉编译器,在运行时才根据需要动态创建,因此比较灵活,但缺点是要占用更多的时间。
16.java的heap是所有线程共享的,堆存放所有 runtime data ,里面是所有的对象实例和数组,heap是JVM启动时创建。
17.只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。
18.大家只要知道String的实例一旦生成就不会再改变了,比如说:String str=”kv”+”ill”+” “+”ans”;
就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和” “ 生成 ”kvill “存在内存中,最后又和生成了”kvill ans”;并把这个字符串的地址赋给了str,就是因为String的“不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的
19.常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
20.new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;
21,String s = new String("abc"); 一个由new String("abc")中的"abc"在String Pool里生成一个值为"abc"的对象;第二个由new在堆里产生一个值为"abc"的对象,该对象完全是String Pool里的"abc"的一个拷贝。变量s最后指向堆中产生的"abc"对象;
String s1 = "abc"; s1先去String Pool找是否有值为"abc"的对象,很显然在上一步中java已经在String Pool里生成一个"abc"对象了,所以s1直接指向String Pool中的这个"abc";
22.存在于.class文件中的常量池。intern()方法无论如何都将返回String Pool里的字符串对象的引用。
分享到:
相关推荐
内存分配通常由Java虚拟机(JVM)自动进行,但程序员也可以通过理解和利用特定的策略来优化这一过程。本篇文章将深入探讨两种内存分配方法——轮转法和高优先权法,并结合Java的内存模型进行分析。 首先,我们要...
本资料总结主要关注JVM内存分配及其运行原理,这对于理解和优化Java应用程序的性能至关重要。 1. **JVM内存结构** JVM内存分为几个关键区域:方法区(Method Area)、堆(Heap)、栈(Stack)、程序计数器(PC ...
### Java内存分配机制详解 #### 一、引言 Java作为一种广泛应用的编程语言,其内存管理机制对于确保程序高效稳定运行至关重要。本文旨在详细介绍Java内存分配机制中的几个关键概念:寄存器、栈、堆、静态域、常量...
操作系统是计算机系统的核心组成部分,它负责管理系统的硬件资源,其中...总之,这个实验提供了一个实践平台,让学生能够探索和比较不同的内存分配策略,理解它们的优缺点,为未来在操作系统领域的工作打下坚实的基础。
本文将基于Java虚拟机(JVM)的内存模型,详细探讨对象在Java中的内存分配过程。 #### 二、Java虚拟机内存区域 Java虚拟机(JVM)是Java程序运行的基础平台,其内部有一套完整的内存管理机制。根据JVM规范,JVM的内存...
在本课程设计中,我们将探讨如何使用Java编程语言模拟两种常见的内存分配策略——首次适应(First Fit)和最佳适应(Best Fit)。这两种策略在操作系统中用于优化内存的使用,避免碎片问题。 首次适应算法是一种...
内存分配算法是操作系统核心部分的关键技术之一,它负责有效地管理和分配计算机内存资源。在这个课程设计中,我们将使用Java编程语言在Eclipse集成开发环境中实现内存分配的模拟。Eclipse因其强大的调试工具和丰富的...
### 深入Java内存分配 #### Java有几种存储区域? Java程序运行时涉及多种不同...以上内容概述了Java内存分配的基础知识、模型以及具体的应用实例,帮助读者更好地理解Java程序运行时内存管理的核心概念和技术细节。
Java内存分配原理是Java编程中不可或缺的基础概念,它关乎程序的性能和稳定性。Java内存主要分为五个区域:寄存器、栈、堆、静态域和常量池。这些区域各有其特定的功能和生命周期。 首先,寄存器是硬件层面的概念,...
Java内存分配是一个核心的知识点,它涉及Java虚拟机(JVM)运行时数据区域的不同部分。在Java程序中,对象的创建、对象的引用以及变量的存储都涉及到内存分配。从给定文件的内容来看,主要探讨了Java内存模型的两个...
Java语言基础内存模型 Java语言基础内存模型是指Java虚拟机(JVM)在计算机内存(RAM)中的工作方式。Java内存模型(Java Memory Model,简称JMM)定义了Java虚拟机在计算机内存中的工作方式,主要关注内存一致性和...
总的来说,这个资料包涵盖了Java内存分配的理论基础、垃圾回收的机制、性能调优的方法以及诊断和解决内存问题的实践技巧。通过学习这些内容,你可以提升对Java内存管理的理解,进而编写出更高效、更稳定的Java程序。
总之,Java内存管理和优化是一个持续的过程,需要开发者具备深厚的理论基础和实践经验。理解内存泄漏的原因,掌握排查和解决方法,是提高Java应用程序稳定性和性能的重要途径。通过上述讨论,希望对大家在实际开发中...
`main`方法中创建了两个`Birthday`对象`d1`和`d2`,分别用`new`关键字在堆内存中分配空间。`d1`和`d2`都是对`Birthday`对象的引用,它们也在栈内存中存储。 1. `change1`方法接受一个`int`类型的形参`i`。形参`i`是...
首先,我们来看Java的内存分配。Java内存主要分为三个区域:栈(Stack)、堆(Heap)和方法区(Method Area)。栈用于存储基本类型变量和对象引用,每个线程都有自己的独立栈空间。当创建一个方法时,栈会为该方法...
Java基础是学习任何Java开发者的基石,而数组作为Java中最基本的数据结构,是理解内存管理的关键。本节我们将深入探讨“Java基础中的数组与内存图解”,了解数组在内存中的存储方式及其工作原理。 首先,数组是Java...
在C++和Java这两种不同的编程语言中,内存分配机制有着显著的区别。让我们深入探讨一下这两种语言的内存分配策略。 在C++中,内存被划分为以下几个区域: 1. **栈(Stack)**:栈内存主要用来存放程序执行过程中的...
总的来说,这段代码提供了一个基础的框架,用于模拟操作系统中的动态内存分配。为了使模拟更完整,需要添加实际的内存分配算法,以及内存回收、显示当前内存分配状态等功能。同时,还需要完善错误处理和用户体验,...