JVM中各内存区域解释,以及变量的作用域解释

转载自:http://blog.csdn.net/zz87250976/article/details/42875301

JVM内存分四种:
1、栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源;
2、堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收;
3、静态区(datasegment)—存放全局变量,静态变量和字符串常量,不释放;
4、代码区(codesegment)—存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域。

在方法(代码块)中定义一个变量时,java就在栈中为这个变量分配JVM内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的JVM内存空间;在堆中分配的JVM内存由java虚拟机的自动垃圾回收器来管理,堆的优势是可以动态分配JVM内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配JVM内存的。缺点就是要在运行时动态分配JVM内存,存取速度较慢;栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。

线面对Java中的变量作用域解释一下:
在Java中,变量的作用域分为四个级别:类级、对象实例级、方法级、块级;
类级变量又称全局级变量或静态变量,需要使用static关键字修饰,你可以与 C/C++ 中的 static 变量对比学习;
类级变量在类定义后就已经存在,占用内存空间,可以通过类名来访问,不需要实例化;
对象实例级变量就是成员变量,实例化后才会分配内存空间,才能访问;
方法级变量就是在方法内部定义的变量,就是局部变量。

时间: 2024-08-08 17:55:33

JVM中各内存区域解释,以及变量的作用域解释的相关文章

C++中的内存区域及其性能特征

首先需要指出的是,我们通常用"堆"和"自由存储"这两个术语来区分两种不同类型的动态分配内存. 1.常量数据:常量数据区域主要用于存储字符串以及其他在编译期就已经知道值的数据.实例化的对象是不能存储在 这 个区域中的. 在程序的整个生存期内,这个区域中的所有数据都是有效的.而且,所有这些数据都是只读的,如果对这些数据进行修改,其结果在C++中是没有定义的.造成这种后果的部分原因是编译器可能会对常量数据的基本存储格式进行任意优化.例如,在某个特定的编译器中,可能会将字符

学习jvm(一)--java内存区域

前言 通过学习深入理解java虚拟机的教程,以及自己在网上的查询的资料,做一个对jvm学习过程中的小总结. 本文章内容首先讲解java的内存分布区域,之后讲内存的分配原则以及内存的监控工具.再下来会着重讲解垃圾回收这一章节,该章节涉及了垃圾的标记算法以及各种垃圾回收算法,然后大概的介绍下市面上使用的垃圾收集器.之后就总结下上面的原理,讲解相关的jvm调优案例.然后会着重讲解类加载过程.最后一章讲字节码的部分,字节码相对来说是比较枯燥而且特别繁琐的内容,最好是自己动手配合着学习会好一点,或者观其大

深入理解jvm之一【内存区域】

文章开始之前,首先需要申明,本系列文章讨论的是HotSpot VM,文章中多数观点基于<深入理解Java虚拟机:JVM高级特性与最佳时间   周志明>,笔者如有理解错误,欢迎指正. 在开始探索jvm虚拟机之前,不得不对jvm的内存区域进行讨论,依旧先附上图表: 程序计数器 程序计数器,也能叫做PC寄存器,从名字上来理解可能会把它想成一个计数的内存区域,但是,了解汇编的人会知道,程序技术器实际上是CPU上的一个寄存器,它保存当前指令执行的地址(也可以说下一条指令所在的存储单元).当cpu执行该线

JVM中的内存分区简介

1.JVM的内存区域划分: 大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) ,   VM Stack(虚拟机栈,也有翻译           成 JAVA 方法栈的),Native Method Stack  ( 本地方法栈 ),其中Method Area 和  Heap 是线程共享的(方法区和堆),其他的几个(VM Stack,Native Method        

C++中的内存区域

常量数据:常量数据区域主要用于存储字符串以及其他在编译期就已经知道值得数据.实例化的对象不能存储在这个区域. 在程序的整个生存期内,这个区域中的所有数据都有效,而且都是只读的,对这些数据进行修改的结果在C++中是没有定义的.一部分原因是编译器可能会对常量数据的基本存储格式进行任意的优化.例如,在某个特定的编译器中,可能会将字符串常量保存在重叠对象中以进行优化. 栈:在栈中存储的是自动变量.自动变量在定义时将被立即构造,并且在其作用域结束时被立即销毁,因此程序员无法对已经分配但尚未初始化的栈空间直

深入理解JVM(一)--Java 内存区域

一.  运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. Java虚拟机所管理的内存将会包括以下几个运行时数据区域:                                   1. 程序计数器 1)程序计数器(Program CounterRegister) 是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器. 在虚拟机的概念模型里, 字节码解释器工作时就是通过改变这个计数器的值来选去吓一跳需要执行的字节码指

JVM笔记3-java内存区域之运行时常量池

1.运行时常量池属于线程共享区中的方法区. 2.运行时常量池用于编译期生成的各种自变量,符号引用,这部分内用将在类加载后接入方法区的运行时常量池中存放. 看如下代码所示,如图: public class Test { public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc"); System

黑马程序员-OC中的点语法,成员变量的作用域

点语法 点语法本质是函数的调用,不是像java中那样,是用来访问成员变量的:oc中访问成员变量是用 -> 访问的: Person *p = [Person new]; p.age = 10; // 如果点语法是进行了赋值操作,那么就相当于调用了setter方法: [p.age]; // 这样不赋值相当于调用了getter: 注意点: 尽量不要在setter或getter中调用点语法,容易引发死循环:死循环是由于递归调用引发的: // 在setter调用点语法 - (void)setAge:(in

JVM虚拟机(一) 内存区域

JVM虚拟机内存组成: 如下图: 1. 程序计数器: (1)是一块较小的内存空间:可以看做当前程序执行子界面的行号指示器,字节码解析器执行的时候就是根据这个判断下一条指令该执行什么. (2)因为cpu在执行代码的时候,会在多个线程之间进行切换执行,所以为了在cup切换后恢复到正确的执行位置,每条线程都有一个独立的程序计数器,各线程之间互不影响,独立存在,我们称此类内存为"线程私有"的内存. (3) 如果当前cup执行的是java代码,这个计数器是记录的是正在执行的虚拟机字节码的地址:如