A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郝强勇 中级黑马   /  2013-2-21 16:12  /  1765 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 haohao827 于 2013-2-23 14:43 编辑

  就是当一个比较全java类加载的时候,比如这个类代码块,静态代码块,内部类,局部变量,静态方法,final修饰,当然也包括new出来的对象等等都存在的时候,在内存中到底是分为多少个区域呢?空间具体是怎么分配的呢?

2 个回复

倒序浏览

不同语言划分方式不同


Java 内存划分: 在Java内存分配中,java将内存分为:方法区,堆,虚拟机栈,本地方法栈,程序计数器。其中方法区和堆对于所有线程共享,而虚拟机栈和本地方法栈还有程序计数器对于线程隔离的。每个区域都有各自的创建和销毁时间。
程序计数器: 作用是当前线程所执行的字节吗的行号指示器。Java的多线程是通过线程轮流切换并分配处理器执行时间方式来实现的。因此,每个线程为了能在切换后能恢复到正确的位置,每个线程需要独立的程序计数器。
Java 虚拟机栈: 每个放在被执行的时候都会同时创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。虚拟内存栈就是我们经常讲的“栈”。其中局部变量表所需内存是在编译期完成分配。
本地方法栈: 与虚拟机栈类似,区别在于虚拟机栈为虚拟机执行Java方法服务,而本地方法栈为虚拟机使用Native方法服务。
Java 堆: 被所有程序共享,并且在虚拟机启动时创建。此内存区域作用是存放对象实例。根据Java虚拟机规定,Java堆可以处于物理上不连续的内存空间,只要逻辑上连续即可。
方法区: 与堆相同,在各个线程间共享。作用是存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
运行时常量池: 是方法区的一部分。作用是存储编译期生成的各种字面量和符号引用。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 赞一个! 另外,请记得去改名~

查看全部评分

回复 使用道具 举报
java变量存储
   1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
    2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
   3. 堆:存放所有new出来的对象。
   4. 静态域:存放静态成员(static定义的)
   5. 常量池:存放字符串常量和基本类型常量(public static final)。
   6,非ram: 存活在程序之外的数据
   对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。
   局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。成员变量存储在堆中的对象里面,由垃圾回收器负责回收。

建议你去看看老毕的视频,第五天的。里面有详细的讲解。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马