Java涉及的内存区域

3/8/2017来源:ASP.NET技巧人气:1262

servlet单实例多线程模式 不太明白servlet中要避免使用”实例变量”的做法 。把变量和内存看看 。

寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制(当时学的不好,现在也没学,还有个大概印象…….)

代码段:用来存放从硬盘上读取的源程序代码 。

堆: 存储所有new出来的对象(包括成员变量,但不包含成员方法,因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法) 没有任何引用指向的对象就是垃圾,垃圾回收器(GC)会不定时到内存中清扫垃圾 。内存泄漏:不再使用的对象没有被及时的回收,当累计多了,就会发生内存溢出了 。

栈: 存储正在调用的方法中的所有局部变量(包括参数) 调用方法时会为该方法在栈中分配一块 对应的栈帧,栈帧中包含方法中的所有局部变量(包括参数),方法调用结束时,栈帧被消除,局部变量也随之消失(速度很快,很及时); 也保存类的实例,即堆区对象的引用 。

常量池:JVM为每个已经加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合 。包括直接常量(基本类型、String)和对其他类型、方法、字段的引用 (与C++不同,C++是直接按址找方法;java是先生成符号,然后JVM自己去找)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用 。常量池存储于堆中 。

方法区:存储.class字节码文件,包括方法(只有一份,通过this来区分具体的对象)