JVM底层基本知识

一、为什么要进行JVM调优

java程序频繁出现故障,故障分三种情况:
  • 1,应用程序自动停止
  • 2, 应用程序的响应时间特别长
  • 3, CPU和内存占用较高

二、jvm 内存结构:

jdk1.7内存结构

在这里插入图片描述

注意:

  • Jdk1.6及之前:有永久代,常量池1.6在方法区
  • Jdk1.7:有永久代,但己经逐步“去永久代”,常量池1.7在堆
  • Jdk1.8及之后:无永久代,常量池1.8在元空间,元空间用metaSpace标识。
  • 年轻代发生的GC叫Minor GC,老年代发生的GC叫Major GC
  • 另外还有一个Full GC,是清理整个堆空间—包括年轻代和永久代

三、GC的几个常用算法

1,标记–清除算法(Mark-Sweep)

标记清除(Mark and Sweep)是最早开发出的GC算法(1960年)。它的原理非常简单,首先从根开始将可能被引用的对象用递归的方式进行标记,然后将没有标记到的对象作为垃圾进行回收。
优点:简单快捷 ;
缺点:内存碎片化严重,会暂停整个应用(Stop-the- world);

2,复制算法(Copying)

该算法将内存平均分成两部分,然后每次只使用其中的一部分,当这部分内存满的时候,将内存中所有存活的对象复制到另一个内存中,然后将之前的内存清空,只使用这部分内存,循环下去。

这个算法与标记-整理算法的区别在于,该算法不是在同一个区域复制,而是将所有存活的对象复制到另一个区域内。标记-复制算法是将内存移动到另外一个空间: 存活区。
优点: 标记和复制可以同时进行,简单快捷 ,不产生碎片;
缺点:需要一个额外的内存区间, 来存放所有的存活对象,浪费内存;

3,标记-压缩算法(Mark-Compact)

标记-整理法是标记-清除法的一个改进版。同样,在标记阶段,该算法也将所有对象标记为存活和死亡两种状态;不同的是,在第二个阶段,该算法并没有直接对死亡的对象进行清理,而是将所有存活的对象整理一下,放到另一处空间,然后把剩下的所有对象全部清除。这样就达到了标记-整理的目的。
优点: 简单快捷 ,不产生碎片;
缺点:清理周期较长,效率不高;

4,引用计数算法(Reference counting)

每个对象在创建的时候,就给这个对象绑定一个计数器。每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。这样,当没有引用指向该对象时,该对象死亡,计数器为0,这时就应该对这个对象进行垃圾回收操作

四、GC的垃圾回收机制(十种)

在这里插入图片描述
1,jdk1.8 常用的是Parallel Scavenge 和Parallel Old 简称PS ,PO,垃圾回收的方法是使用的多线程的方式进行回收。
2,jdk1.7 常用的是Serial 和 Serial Old ,这种回收机制使用的是单线程,当发生Stop-The-World 时,服务器可能出现停顿。
3,ParNew 和CMS 组合使用,使用的是多线程并发执行,容易产生浮动垃圾,不建议使用。
4,jdk1.9默认使用的是G1,使用网格存储伊甸区、老年区、交换区等。

五、垃圾回收的重要参数:

堆设置

-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5。
-XX:MaxPermSize=n:设置持久代大小

元空间设置

-XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
-XX:MaxMetaspaceSize,最大空间,默认是没有限制的。
-XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集
-XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集

注意:-Xms -Xmx 这两个一版设置成一样大小,内存直接分配好后,jvm就不用再去动态计算分配内存了。

六、垃圾回收常用命令:

1,查看当前jvm使用的是哪种垃圾回收机制命令:
java -XX:+PrintCommandLineFlags -version
2,启动项目,打印GC日志:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:./log/gc.log
3,查看服务器上有几个java项目进程:
jps -l
4,开发工具 配置打印GC参数:
-verbose:gc
5,开启一个新的GC收集机制:
-XX:+UseParallelGC -XX:+UseParallelOldGC

七、垃圾回收调优常用工具

1,jdk自带可视化工具:jvisualvm.exe
2,阿里开源组件:Arthas

参考:https://www.jianshu.com/p/376e90c471c0
https://blog.csdn.net/u013380694/article/details/83341913
https://docs.oracle.com/javase/specs/
https://www.cnblogs.com/halberts/p/11918326.html (各种调优参数)
马士兵 jvm 视频教程

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值