Java虚拟机运行时数据区域:
1.程序计数器
a) 类似于计算机组织原理中PC计数器。
b) 线程私有。
c) 唯一一个没有OOM的区域。
2.Java虚拟机栈
a) 线程私有。
b) 相当于栈内存,每个元素为一个栈帧。
3.本地方法栈
a) 用于执行Native方法(所谓Native方法就是用C语言等较底层语言写的方法)。
4.Java堆
a) 存放对象地方。
b) 分为新生代和老年代。
5.方法区
a) 所有的类被虚拟机加载后存放在此处。
b) 被称为“永久代”。(刚看的时候有点疑惑,想不明白这个名称到底有什么含义,学到后面的GC还有类加载章节后才慢慢有点感悟。因为在java虚拟机的运行时数据区域的大小是有限的,里面的数据满了以后就会发生溢出,所以要时刻进行垃圾收集。虽然垃圾收集动作重点集中在java堆中,但是方法区里面也存在大量数据,不进行垃圾收集的话也有可能会发生内存泄漏。不过方法区的垃圾收集相对较少,这也是被称为“永久代”的原因,几乎永远不会被收集,这是因为方法区存放的是类被加载后的信息,相当于把class文件进一步处理得到的信息,这些信息是准备在运行时刻被使用的。如果被垃圾收集,等到再需要时又要重新加载就会非常耗时,所以通常很少被GC。这只是我自己的理解欢迎大家指正。)
6.运行时常量池
a) 是方法区的一部分。
b) 存放编译期生成的各种字面量和符号引用。
c) 有时候翻译出来的直接引用也存储在运行时常量池中。
d) 运行期间也有可能将新的常量放入池中,例如string类的intern()方法。
7.直接内存
Java虚拟机运行时数据区域:
1.程序计数器
a) 类似于计算机组织原理中PC计数器。
b) 线程私有。
c) 唯一一个没有OOM的区域。
2.Java虚拟机栈
a) 线程私有。
b) 相当于栈内存,每个元素为一个栈帧。
3.本地方法栈
a) 用于执行Native方法(所谓Native方法就是用C语言等较底层语言写的方法)。
4.Java堆
a) 存放对象地方。
b) 分为新生代和老年代。
5.方法区
a) 所有的类被虚拟机加载后存放在此处。
b) 被称为“永久代”。(刚看的时候有点疑惑,想不明白这个名称到底有什么含义,学到后面的GC还有类加载章节后才慢慢有点感悟。因为在java虚拟机的运行时数据区域的大小是有限的,里面的数据满了以后就会发生溢出,所以要时刻进行垃圾收集。虽然垃圾收集动作重点集中在java堆中,但是方法区里面也存在大量数据,不进行垃圾收集的话也有可能会发生内存泄漏。不过方法区的垃圾收集相对较少,这也是被称为“永久代”的原因,几乎永远不会被收集,这是因为方法区存放的是类被加载后的信息,相当于把class文件进一步处理得到的信息,这些信息是准备在运行时刻被使用的。如果被垃圾收集,等到再需要时又要重新加载就会非常耗时,所以通常很少被GC。这只是我自己的理解欢迎大家指正。)
6.运行时常量池
a) 是方法区的一部分。
b) 存放编译期生成的各种字面量和符号引用。
c) 有时候翻译出来的直接引用也存储在运行时常量池中。
d) 运行期间也有可能将新的常量放入池中,例如string类的intern()方法。
7.直接内存