JVM的内存布局和垃圾回收机制

1、JVM的内存布局:

1.1、Java堆:是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,对象实例在这里分配内存。是垃圾收集器(GC)管理的主要区域

1.2、Java虚拟机栈:每个方法在被调用时就会创建一个栈帧,每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈出栈的过程

例:

解释:A方法打包成栈帧放入虚拟机栈中,B方法执行完出栈,继续执行紧跟着的方法

1.3、方法区:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,运行时常量池(Runtime Constan Pool)是方法区的一部分

1.4、程序计数器:代码所在行号的指示器

1.5、直接内存:直接内存(direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域

2、jdk的版本不同,jvm内存布局存在差异

①jdk1.6以前:运行时常量池在方法区;

②jdk1.7时:运行时常量池放在堆中;

③jdk1.8:运行时常量从堆中移除,取而代之的是元空间,元空间是在运行时数据区之外,本地内存单独分配的

3、垃圾回收机制算法

3.1标记清除算法:

缺点:存在内存碎片

例:每一块是1K,要存住8K大小,虽然累计有超过8K的,但是没有一块连续空间超过8K

3.2复制算法

内存区域分成两个部分,每次只用一半,内存区域不够了,需要垃圾回收了,左边存活的对象依次挪到右边按顺序排好,一次将左边的区域回收了,这样右边的数据很规整。

缺点:存在空间的浪费,总有一半的区域没使用上

3.3标记-整理算法

需要回收的内存区域做一标记,存活的区域进行移动,按照某种顺序在回收后的内存区域放好,需要回收的区域一次性回收掉,内存很规整。

缺点:内存区域块的移动,对性能有一定影响

3.4分代收集概念

新生代(使用完以后可以马上回收):采用复制算法,活过一定次数的对象升级到老年代

老年代:可能用标记清除算法、标记整理算法,垃圾回收的线程可以是一个,可以是多个

发布了5 篇原创文章 · 获赞 0 · 访问量 238

猜你喜欢

转载自blog.csdn.net/qq_31129841/article/details/105381471
今日推荐