1、首先这是一个Demo类,那么在编译后会生成Demo.class文件,放在常量池中;2、main方法是程序的主入口,那么在栈中会生成main方法的方法帧。3、执行第一行代码inti=1; 由于int是基本数据类型,会在栈中给 i=1分配内存空间。4、下面执行String……,由于String是引用数据类型,那么str变量名会放在栈中,但是里面的值"...
编译器在执行String s1 = "china";时会先在常量池中查找是否存在字符串常量“china”,如果不存在就在常量池中new一个china字符串,存在就不new,然后让栈中的变量指向这个china字符串。因此常量池中只有一个china字符串对象,然后在执行String s2 = "china";String s3 = "china";时,会在常量池中找到china字符串...
堆:用于存放在程序中new出来的对象,.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 栈: 用于存放基本类型的数据变量和对象的引用,但对象本身不在栈中,如果是new出来的对象则存放在堆中,如果是字符串常量则放在常量池中。 每个线程包含一个栈区,栈中只保存基础数据类型的对象...
说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了。在程序执行的时候,常量池会储存在方法区(Method Area),而不是堆中。 栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享(指的是线程共享,而给进程共享)。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要...
一般Java在内存分配时会涉及到这几个区域:栈区(stack)、堆区(heap)、方法区(Method Area)、常量池。我们先对下面几个概念进行深刻了解后,再进行画图分析类和对象在内存中的变化及表现形式。 栈:存放基本类型的数据和对象的引用变量的数据,但对象本身不存放在栈中,而是存放在堆中(new 出来的对象)...
说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了。在程序执行的时候,常量池会储存在方法区(Method Area),而不是堆中。 栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享(指的是线程共享,而给进程共享)。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要...
Java 的 JVM 的内存可分为 3 个区:堆内存(heap)、栈内存(stack)和方法区(method)也叫静态存储区。 在学习的过程中经常还会听到常量池这一术语,在上节关于数据做 == 比较时,提到了字符串常量池,经查询得知常量池既不属于堆,也不属于栈内存 ,那么常量池可能就和方法区有所关系,为此阅读《深入浅出JVM》一书...
本地方法栈执行的是native方法(什么是Native方法?) Java堆(Java Heap) java堆是JVM内存中最大的一块,由所有线程共享,是由垃圾收集器管理的内存区域,主要存放对象实例,当然由于java虚拟机的发展,堆中也多了许多东西,现在主要有: 对象实例 类初始化生成的对象 基本数据类型的数组也是对象实例 字符串常量池 字符串常...
虚拟机栈本地方法栈程序计数器 线程共享:堆方法区(1.8之前叫永久代,1.8之后叫元空间)直接内存(在Java运行时内存区域之外)程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环...
引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随...