1.引言
虽然之前看过java编程思想,当时了解点jvm内存区域的划分,和内存的分配,但是长时间不看的确是忘记了不少,所以记下笔记,看的书是深入理解java虚拟机。
2.正题
运行是数据分配如图所示:
Paste_Image.png线程计数器: 一块较小的内存区域,可以理解成当前线程所执行的字节码的行号指示器。属于线程私有(假如不是私有那么多线程条件下,代码的执行就会乱码),唯一在Java虚拟机规范中没有规定任何OutOfMemoryError情况区域。
栈(jvm栈)。栈的访问速度大于堆,并且内存小于堆。当方法执行的时候,就会在栈里面创建一个栈帧。这个栈帧里面有哪些数据呢?
1.存储局部变量表。这个表里面有这些数据:
局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型)。栈是现成私有,并且内部的存储的数据是可以复用的,也就是说int a=3 和int b=3 。在栈中 3只存在一个。
注意:
全局非static的常量,例如:int a=3;是保存在堆中,而publi static int b=2;是保存在 常量区。
java 堆(heap).所有线程共享的内存区域存放的是对象的实例。垃圾收集器管理的主要区域。在堆里面有一个实例对象Student。这个Student占用的物理地址可以不连续。只要逻辑连续就行。这也是堆上内存的一个优点。
方法区(静态区)
方法区也是线程共享的区域,用于存储已经被虚拟机加载的类信息,常量,静态变量和即时编译器(JIT)编译后的代码
** 运行时常量池**
运行时常量池是方法区的一部分,Class文件中除了有类的版本,字段,方法,接口等信息以外,还有一项信息是常量池用于存储编译器生成的各种字面量和符号引用,这部分信息将在类加载后存放到方法区的运行时常量池中。
网友评论