`
xiaomogui
  • 浏览: 239398 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java基础之内存分配

阅读更多

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内存分配全面浅析

    所以在学习Java内存分配原理的时候一定要牢记这一切都是在JVM中进行的,JVM是内存分配原理的基础与前提。l.寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。2.栈:保存局部变量的值,包括:1.用来保存基

    操作系统 内存管理 java编写

    操作系统 内存管理 源代码 java编写 word 里面有源代码~~~~

    java中与继承有关的程序内存分析

    想要下载此文件,请先下载本人“java程序中的内存分配问题”,因为那个例子比较简单而且分析详细透彻,可以使你更容易理解,如果你对java程序执行过程中的内存分配有一定的了解,可以直接下载本文件

    2017-广东工业大学操作系统之进程调度、作业调度、内存分配实验报告Java

    工具:Eclipse Java ...内存分配:首次适应算法FF、循环首次适应算法NF、最佳适应算法BF、最坏适应算法三种算法WF 前两个实验在别人基础上添加修改功能,界面还可以,后一个自己实现存在小瑕疵,请注意。

    Java核心基础+Java中的数据在内存中的存储

    1、内存中的堆(stack)与栈(heap) 2、Java中数据在内存中的存储 基本数据类型的存储 ...3、Java内存分配中的栈 Java内存分配中的堆 4、String.intern() 5、关于equasl()与== 6、关于String是不可变的

    java基础入门教程

    在 这 次 会 上 ,Java的 创 始 人 之 一 James Gosling 说 :"Java 不仅 仅只 是 applets, 它 能 做任 何 事 情 ",Dta 咨 询 公 司 的 高 级软 件 工 程 师 Rich Kadel说 :"Java 不仅 仅 是 一 种 程 序 设计 语言 ,...

    Java基于动态分区算法(FF_BF_WF)的内存分配模拟程序源码+项目说明.zip

    基于动态分区算法的内存分配模拟程序,包括首次适应算法,最佳适应算法、最坏适应算法。 一、项目功能 1. 提供三种动态分区模拟算法:首次适应算法,最佳适应算法,最坏适应算法。 2. 利用画布动态显示内存分区...

    Java零基础-对象的创建和使用-内存分析.md

    通过示例代码和详细解释,帮助读者理解对象的创建过程、内存分配和使用方法。 能学到什么: 理解对象的创建过程和内存分配。 掌握对象的成员变量和方法的访问方式。 理解栈内存和堆内存的概念和作用。 了解对象的...

    Java面试基础测试题及答案

    4、 Java的核心机制是什么?并介绍其核心机制 ...它提供一种系统级线程跟踪内存的分配情况。并在JVM的空闲时,检查并释放无用的内存空间。垃圾收集在程序运行的过程中自动进行,程序员无法控制和干涉

    java基础知识总结.docx

    对java一些常用基础的总结,java基本知识,数组,java内存分配,方法总结,面向对象,常用API,常用集合

    java基础心得总结.rar

    描述java基础容易忽略的问题,如下面几个知识点: int a = 1;1会存放在栈里 String s1 = "thanks";thanks会存放在data segment里 String s2 = new String("thanks");thanks会存放在data segment里 String a ="th...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    面向对象编程的基础 要了解面向对象编程(OOP)的基本概念,需要理解 OOP 的三个主要概念,它们撑起 了整个 OOP 的框架。这三个概念是:封装、继承性和多态性。除此以外,还需了解对象、 类、消息、接口、及抽象等...

    java源码包---java 源码 大量 实例

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    深入java虚拟机

    1. JVM调优 1.1 JVM调优总结(一)-一些概念 1.2 JVM调优总结(二)-一些概念 1.3 JVM调优总结(三)-基本垃圾回收算法 1.4 JVM调优总结(四)-垃圾...4.2 JVM内存管理:深入垃圾收集器与内存分配策略 4.3 深入理解JVM

    01-Java基础-函数(启发式定义

    这是传智博客的教学视频,里面讲述了java里函数的一些概念,包括内存空间的分配。

    Java基础[02-Java基础语法2].ppt

    本章节主要涉及的范围包含:数组的定义、数组的初始化(动态初始化)、数组元素访问、数组内存分配、数组的初始化(静态初始化)、数组中的操作、方法的概述、方法的定义、方法的特点、方法的应用、方法的重载

    java基础补足和thinking In Java学习.rar

    3.使用构造器可以创建对象 关键字:new 创建对象时将在堆内存中给对象分配空间 5.2 方法重载 1. 什么是方法重载:在同一个类中,方法名相同但提供的参数个数和类型不同的两个方法叫做方法重载。 需要注意的是...

    【Java语言基础】final关键字

    【Java语言基础】final关键字 修饰词:final 最终的最后的 final关键字可用于修饰符,变量和方法,用于表示它修饰的类,方法和方法不可改变。 final 最终的最后的 final修饰变量时,表示该变量一旦获得了初始值之后...

    并发编程基础知识,java内存模型及多线程、volatile

    Java内存模型,即:JMM。当程序执⾏并⾏操作时,如果对数据的访问和操作不加以控制,那么必 然会对程序的正确性造成破坏。因此,我们需要在深⼊了解并⾏机制的前提下,再定义⼀种规则, 来保证多个线程间可以有效地...

Global site tag (gtag.js) - Google Analytics