jvm内存笔记
目录
美图说个**,先上图:
如上图所示嘛:
首先嘛JVM内存区分为堆heap(上图白色区域)、非堆non-heap(上图蓝色区域)。
堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给 自己用的,
-
一:non-heap
- 非堆中的方法区 Method Area (也称永久带)是用来存放类信息、常量、静态变量的。这个内存区可以用上图中橘黄色的参数进行配置;方法区中有一个常量池:用于存放各种符号引用;
- 虚拟机栈用于存放局部变量表(基本数据类型、对象引用等)、操作栈、方法出口;
- 本地方法栈与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务;
-
程序计数器用来记录程序下一条指令。
-
二:heap
1:堆内存用来存放对象实例和数组(所有new对象),这里可以通过上面的橘黄色的参数配置大小;
2:堆内存分为两部分:
a:年轻代Young;年轻代是用来存放刚创建的对象,可以使用上图中的橘黄色参数配置大小;
b:老年代Old;老年代是用来存放大对象或者已经存活了很久的对象;
3:其中年轻代又分为三部分:
a:Eden;
b:From Survivor;
c:To Survivor;
主要使用复制清除算法,在Eden内存块和其中一个Survivor把需要保存的数据移到另一个Survivor,下次继续反复,直到15次之后便更新到老年代中,执行一次GC,命名为 Minor GC。其中老年代称为Full GC。
参考链接:Java虚拟机的内存组成以及堆内存介绍
Xms Xmx PermSize MaxPermSize 区别