- 引用计数(存在循环引用问题)
- 根搜索(可达)算法 Root Searching
- 标记阶段,找到所有可访问对象打个标记。清理阶段,遍历整个堆
- 对未标记对象(即不再使用的对象)逐一进行清理
特点: 优点:算法简单 缺点:标记-清除最大的问题会造成内存碎片,但是不浪费空间,效率较高(如果对象较多时,逐一删除效率也会受到影响)
- 标记阶段,找到所有可访问对象打个标记
- 内存清理阶段时,整理时将对象向内存一端移动,整理后存活对象连续的集中在内存一端。
特点:
- 标记-压缩算法好处是整理后内存空间连续分配,有大段的连续内存可分配,没有内存碎片。
- 缺点是内存整理过程有消耗,效率相对低下
先将可用内存分为大小相同两块区域A和B,每次只用其中一块,比如A。当A用完后,则将A中存活的对 象复制到B。复制到B的时候连续的使用内存,最后将A一次性清除干净。
特点
- 好处是没有碎片,复制过程中保证对象使用连续空间,且一次性清除所有垃圾,所以即使对象很多,收回效率也很高
- 缺点是比较浪费内存,只能使用原来一半内存,因为内存对半划分了,复制过程毕竟也是有代价
- 效率: 复制算法>标记清除算法> 标记压缩算法
- 内存整齐度: 复制算法=标记压缩算法> 标记清除算法
- 内存利用率: 标记压缩算法=标记清除算法>复制算法
对于大多数垃圾回收算法而言,GC线程工作时,停止所有工作的线程,称为Stop The World。GC 完成 时,恢复其他工作线程运行
Heap堆内存分为
- 年轻代Young:Young Generation
- 伊甸园区eden: 只有一个,刚刚创建的对象
- 幸存(存活)区Servivor Space:有2个幸存区,一个是from区,一个是to区。大小相等、地位相同、可互换。
- from 指的是本次复制数据的源区
- to 指的是本次复制数据的目标区
- 老年代Tenured:Old Generation, 长时间存活的对象
永久代:JDK1.7之前使用, 即Method Area方法区,保存JVM自身的类和方法,存储JAVA运行时的环境信息, JDK1.8后 改名为 MetaSpace,此空间不存在垃圾回收,关闭JVM会释放此区域内存,此空间物理上不属于 heap内存,但逻辑上存在于heap内存永久代必须指定大小限制,字符串常量JDK1.7存放在永久代,1.8后存放在heap中 MetaSpace 可以设置,也可不设置,无上限
规律: 一般情况99%的对象都是临时对象
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
选项分类
- -选项名称 此为标准选项,所有HotSpot都支持
- -X选项名称 此为稳定的非标准选项
- -XX:选项名称 非标准的不稳定选项,下一个版本可能会取消
java -Xms1024m -Xmx1024m -jar xxxx.jar
JProfiler是一款功能强大的Java开发分析工具,它可以快速的帮助用户分析出存在的错误,软件还可对需 要的显示类进行标记,包括了内存的分配情况和信息的视图等
https://www.ej-technologies.com/products/jprofiler/overview.html
默认不指定,-Xmx大约使用了1/4的内存,当前本机内存指定约为1G 在bin/catalina.sh中增加一行
......
# OS specific support. $var _must_ be set to either true or false.
#添加下面一行
JAVA_OPTS="-server -Xms128m -Xmx512m -XX:NewSize=48m -XX:MaxNewSize=200m"
cygwin=false
darwin=false
........
-server:VM运行在server模式,为在服务器端最大化程序运行速度而优化
-client:VM运行在Client模式,为客户端环境减少启动时间而优化
java8 年轻代 和 老年代 分别是不同的垃圾回收器
强调用户交互 ParNew + CMS
强调吞吐量 Parallel Scavenge + Parallel Old
java11起, 不在区分, 默认G1 垃圾回收器