Java程序运行的内存分配

Java的内存分配

A:栈 存储局部变量
B:堆 存储所有new出来的
C:方法区(面向对象部分详细讲解)
D:本地方法区(系统相关)
E:寄存器(CPU使用)

注意:
a:局部变量 在方法定义中或者方法声明上定义的变量。
b:栈内存和堆内存的区别
栈:数据使用完毕,就消失。
堆:每一个new出来的东西,且都有地址

每一个变量都有默认值
byte,short,int,long 0
float,double 0.0
char ‘\u0000‘
boolean false
引用类型 null
数据使用完毕后,在垃圾回收器空闲的时候回收。

栈与堆的具体区别

堆和栈都是内存上的一快空间,
只是栈是先进后出的,就像一个长管子,只一边有留孔,向里面放东西,
先放入的在底部,后放入的在先放入的上面,要想拿出先放入的,要先拿出后放入的.由无需程序员管理,使用即可。

堆就象一块空地,可以随便放,和随便取.由程序员管理,用时申请,不用时要求手动释放(否则可能发生内存溢出)。
另外,栈的执行速度快,而堆的执行速度相比就慢了下来,因为他可以随时,随大小存取。

栈区内存,由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。访问顺序遵循先进后出原则。 栈stack:是程序启动时候由程序留出的工作内存区  比如程序的局部变量,函数调用等都是从栈中获取,这个内存在需要的时候分配,不需要就释放,由程序编译时确定栈区空间大小。 
堆heap:是计算机空余的物理内存和硬盘空余空间的和。但是它的获取不是自动的了,相比从栈中分配内存要慢些。 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。堆区空间是应用程序在运行的时候请求操作系统分配给自己内存。
时间: 2024-08-24 13:36:24

Java程序运行的内存分配的相关文章

获取java程序运行时内存信息

由于最近想自己动手测试一下String和StringBuffer的效率问题,需要获取程序运行时的内存占中信息,于是上网查了一下,根据查到的资料写了个程序,发现结果有问题,才发现查到的资料是错误的.所以在这里跟大家分享一下获取内存占用的正确方法 错误的方法 //程序开始时:(先调用一下垃圾回收,但是不一定立即执行) Runtime.getRuntime().gc(); long initm=Runtime.getRuntime().freeMemory(); //程序结束时: Runtime.ge

java学习-----jvm的内存分配及运行机制

VM运行时数据区域: 根据<Java虚拟机规范(第二版)>的规定,JVM包括下列几个运行时区域: 我们思考几个问题: 1.jVM是怎么运行的? 2.JVM运行时内存是怎么分配的? 3.我们写的java代码(类,对象,方法,常量,变量等等)最终存放在哪个区? VM运行时数据区域: 1.程序计数器(program Counter Register):   是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的

java 运行时内存分配 堆和栈区别

java 运行时 内存 分配 一个java进程可以包含多个线程 一个Java进程对应唯一一个JVM实例 一个JVM实例唯一对应一个堆 每一个线程有一个自己私有的栈 这儿也可以看出线程共享进程的堆, 但不共享栈 这篇文章里有一道 线程和进程面试题 堆 堆是被线程共享的 一个进程只有一个堆 堆中存放对象本身和数组本身 java 中, 数组(比如 int[]) 也是继承Object对象, 不是继承Object[] 栈 数据结构里面讲了, 栈是先入后出 栈中存放的是对象的引用(声明和引用对象是有先后顺序

Java程序运行机制及运行过程

Java运行机制 Java虚拟机(Java Virtual Machine):Java虚拟机可以理解成一个以字节码为机器指令的CPU:对于不同的运行平台,有不同的虚拟机:Java虚拟机机制屏蔽了底层运行平台的差别,真正实现了“一次编译,随处运行”. Java垃圾回收(Garbage Collection):不用使用的内存空间应该回收:在C/C++等语言中,由程序员负责回收无用的内存:Java语言消除了程序员回收无用内存的职 责,它提供一种系统级线程跟踪存贮空间的分配情况,并在JVM空闲的时候,检

程序运行时内存管理

1,管理运行阶段内存空间分配 malloc()/new; int *pn = new int(存储的类型,内存根据此设定相应存储字节的内存) pn是内存地址(所以 当声明一个变量的指针变量时没初始化,声明后再来初始化则pn 接收的应该是变量在内存中的地址 &VariableName); *pn是存储在内存的值 用于给所指向内存中的变量赋值; 为一个数据对象(结构,基本类型)获得并指定分配内存格式 typeName pointer_name = new typeName; 指定需要什么样的内存和用

java程序运行分析

使用工具:Eclipse Stardard 4.32版本(window7环境) 今天我们通过一个及其简单的例子来分析一个java程序是如何在我们的及其上跑起来的.部分内容是参考其他人的,会在参考的地方注明. 我的测试代码部分如下: public class Test { public static void main(String[] args) { new Test(); Int test =1;//只是为了测试方便,去掉IO部分的分析 } } 就是这么简单的代码,如何在我们的机器上跑起来,确

C语言程序编译的内存分配

C语言程序编译的内存分配: 1.栈区(stack) --编译器自动分配释放,主要存放函数的参数值,局部变量值等: 2.堆区(heap) --由程序员分配释放: 3.全局区或静态区 --存放全局变量和静态变量:程序结束时由系统释放,分为全局初始化区和全局未初始化区: 4.字符常量区 --常量字符串放与此,程序结束时由系统释放: 5.程序代码区--存放函数体的二进制代码 例: //main.c int a=0; //全局初始化区 char *p1; //全局未初始化区 void main() { i

[转]使用Java Mission Control进行内存分配分析

jdk7u40自带了一个非常好用的工具,就是Java Mission Control.JRockit Misson Control用户应该会对mission control的很多功能十分熟悉,JRockit也是一款很棒的工具.本篇文章将着重关注如何使用Java Flight Recorder进行内存分配分析. jvm有着非常棒的小块内存虚拟化技术,这会让你产生一种拥有无限内存的错觉感,其实它的开销非常大.有时候jvm需要找出此刻堆上数据是如何被使用的,并把剩余的空间扩大——这就是垃圾回收.产生这

Linux下程序运行时内存状态及相应查看工具

最近在解决一个编译问题时,一直在考虑一个问题,那就是Linux下可执行程序运行时内存是什么状态,是按照什么方式分配内存并运行的.查看了一下资料,就此总结一下,众所周知,linux下内存管理是通过虚存管理的,在分配内存是并非在物理内存开辟了一段空间,而是在使用时才分配的,而且是通过段页式管理.以上比较废话,开始看看程序运行时内存会是什么状态. 在linux下内存分配是以页为单位的,而页是通过段管理,各个段之间是独立的,方便管理.linux程序运行时,可以分为以下几个内存段: 一.BSS段 (bss