Java程序执行流程:
谈一谈Java内存区域的划分实际上是指JVM内存区域的划分,首先Java先介绍一下Java程序具体执行的过程
如上图所示,首先Java源代码们(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕后,交给JVM执行引擎.在整个程序的执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存.因此,在Java中我们常常说到的内存管理就是针对这段空间进行管理(如何分配和回收内存空间).
下面是画一个草图理解清晰一些:

解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。
答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、"hello"和常量都是放在静态区中。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。
String str = new String("hello");
上面的语句中变量str放在栈上,用new创建出来的字符串对象放在堆上,而"hello"这个字面量放在静态区。补充:较新版本的Java(从Java 6的某个更新开始)中使用了一项叫"逃逸分析"的技术,可以将一些局部对象放在栈上以提升对象的操作性能。
栈存放的是什么?
1基础数据类型 byte short int long float double char boolean2方法的形式参数,方法调用完后从栈空间回收3引用对象的地址,引用完后,栈空间地址立即被回收,堆空间等待GC堆存放的是什么?
1 this
2 new出来的对象
3数组
a) jvm只有一个堆区,并被所有线程共享。
方法区域(又叫 静态区)存放的是什么?
1字符串常量
2 static
3所有的class
a)被所有线程共享, 其内存放程序中永远唯一的元素,eg: static class
方法区在JVM也是一个非常重要的区域,它与堆一样,是被线程共享的区域。
在方法区中,存储了每个类的信息(包括类的名称,方法信息,字段信息)、静态变量、常量以及编译器编译后的代码等。
在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。
常量池存放什么?
用于存放编译期生成的各种字面量和符号引用,是方法区的一部分
本地方法栈
本地方法栈与Java栈的作用和原理都非常相似。区别只不过是Java栈是为了执行Java方法服务的, 而本地方法栈则是为了执行本地方法(Native Method)服务的。 在JVM规范中,并没有对本地方法具体的实现方法以及数据结构的强制指定, 虚拟机可以自由实现它。在HotSpot虚拟器中直接就把本地方法栈和Java栈合二为一。
对于堆栈、方法区(静态区)、常量池的理解
1、 java7之前,方法区位于永久代(PermGen),永久代和堆相互隔离,永久代的大小在启动JVM时可以设置一个固定值,不可变;
2、 java7中,static变量从永久代移到堆中;
3、 java8中,取消永久代,方法存放于元空间(Metaspace),元空间仍然与堆不相连,但与堆共享物理内存,逻辑上可认为在堆中
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
3、new出来的对象,有初始值。
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
4、没有初始值
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量或方法。
2.方法区中包含的都是在--整个程序中永远唯一的元素,如class,static变量。
1.每一个进程,都有多个线程,多线程指的是一个程序可以同时执行多个指令,就好比我们在使用微信的时候,我们可以一边视频聊天一边文字聊天,这样同时进行的东西就叫做多线程。
总结:
1.每一个线程,又有其独立的栈空间,栈空间是在CPU的内存里面的,栈空间只保存基本数据类型的对象和对象的引用,而对象都放在堆空间中。
堆空间只有一个,在java的JVM(虚拟机)里面,还有一个存放常量池的方法区,每一个类型都有一个常量池,用来存放其类型的内容, final 变量存储在常量池中
网友评论