【JVM学习笔记】Java虚拟机内存管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/java_faep/article/details/81357990

运行时数据区

线程共享:方法区、堆内存

线程私有:虚拟机栈、本地方法栈、程序计数器

程序计数器:

1、是一块比较小的内存空间,它可以看作是当前线程执行的字节码的行号指示器

2、每一个线程都有自己的程序计数器

3、如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果正在执行的是native方法,这个计数器的值为undefined

4、此区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域,因为他是虚拟机使用的内存,不是开发人员指定大小并使用的

虚拟机栈

1、虚拟机栈描述的就是Java方法执行的动态内存模型(方法开始执行到执行完成)

2、栈帧:每个方法执行都会创建一个栈帧,伴随着方法从创建到执行完成,用于存储局部变量表,操作数栈,动态链接,方法出口等

3、局部变量表:存放编译期可知的各种基本数据类型,引用类型,returnAddress类型

4、局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的,在方法运行期间是不会改变局部变量表的大小

5、大小:StackOverflowError 栈里放不下方法

OutOfMemoryError 栈的内存大于指定的内存的大小

本地方法栈

虚拟机栈为虚拟机执行Java方法服务

本地方法栈为虚拟机执行native方法服务

Java堆

1、存放对象的实例

2、垃圾收集器管理的主要区域

3、新生代,老年代,Eden空间

4、堆内存不足 OutOfMemoryError

5、通过 -Xmx 和 -Xms来设置堆内存大小

方法区

1、存储虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码数等据

类的信息:类的版本、字段、方法、接口

2、方法区和永久代 Hotspot使用方法区实现永久代,二者并不等价

3、垃圾回收在方法区的行为 常量池的回收,类型的卸载,效率低,很少出现

4、异常的定义:OutOfMemoryError

运行时常量池

属于上面的方法区

String s1 = "abc"; 存放在常量池中,可以想象为常量池中有个StringTable:类型是Hashset的,不可重复的,所以常量池中只会有同一个相同的值

String s2 = new String("abc"); 存放在堆中 s2.intern()方法会将对象的abc放到常量池中

s1==s2.intern() 结果是true intern()方法是个native方法

直接内存

NIO中使用,一般用不到

猜你喜欢

转载自blog.csdn.net/java_faep/article/details/81357990
今日推荐