JVM基础

首先简单介绍几个Java常用参数.

  1. JVM

    JVM是Java虚拟机. Java程序都是运行在这个虚拟机中的,虚拟机的优势是隔离了物理机的环境,对程序来说,不管Linux还是Windows环境都是一样的,因为他们调用系统接口时实际是调用了JVM,由JVM去调用实际的系统接口,实现了一套代码的跨平台运行,提高了代码的可移植性,这也是Java最引以为傲的地方.

  2. -Xmx

    JVM可使用的最大内存,如果使用内存到达这个阈值则触发GC操作,超过则抛出OutOfMem(OOM).一般配置为物理机内存的一半.

  3. -Xms

    JVM初始使用内存.空余内存大于70%时,JVM就会收缩内存到Xms指定的大小,这样可以释放部分内存供其他程序使用.

为什么Xmx配置为内存的一半?

JVM做GC(垃圾回收)时,主要根据两个内容,来回收对象.

  1. 可达性算法

    JVM从根路径开始检查,将从根路径开始可以连接到的(存在互相调用关系的)保留,将其他的释放.

在这里插入图片描述

  1. 计数法

    计算一个对象被调用的次数,对象被调用一次则增加,没有被调用则减少,GC回收时删除那些被调用为0的.

当垃圾回收后,由于回收的对象是不固定的,所以回收结束虽然释放了大量的内存空间,但是同时带来一个新的问题:内存太零散了.

在这里插入图片描述

如上,一整个的内存绿色部分是未被JVM使用的,红的是已回收的,黄色的是剩余.

不管是内存还是磁盘,顺序读写的性能远远高于随机读写.

这时候,如果继续使用已经释放的空间,一个对象可能要拆成两块甚至更多的去存储,这样将会大幅度的拉低效率,所以,此处使用了复制算法.

在这里插入图片描述

顾名思义,JVM将剩余的对象全部复制到另一半未使用的内存,并将它们依次写入,这样,空间又被紧凑到了一起,但是带来的缺点就是:每次只能用一半的内存,如果分配过大,恰巧一次GC没有释放多大空间,复制时将会没有空间去存储.

垃圾回收(GC)

JVM把新生代分成了三部分:一个Eden和两个survivor(from和to)区域,他们的大小大概是8:1:1.

一般情况新创建的对象会被分配到Eden区域,对象经过一次GC后如果仍然存活(GC会回收掉大概80%的对象),那么将会被移动到Survivor区域,在Survivor区域中没活过一次GC,年龄则会加一,当到达一定次数,将会被移动到old(年老代)区.

年轻代中80%的对象都是朝生夕死的,所以年轻代垃圾回收使用复制算法,复制算法就是将内存分成两块,每次只是用其中的一块,当这块内存用完后,这时候就会触发GC,回收对象释放空间.

在这里插入图片描述

在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

何时触发GC

GC也分为多种.

  1. minor GC(有名major GC):当Eden区域内存用满,触发.

  2. Full GC:全局GC,老年代或方法区空间不足时会触发,或通过Minor GC后进入老年代的平均大小大于老年代的可用内存,由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小时都会触发.

Java对象基本都是朝生夕死,所以minor GC会十分频繁,回收速度也很快.

注:GC过程中,线程全部处于挂起状态,是无法接收请求的,所以频繁的GC会影响业务.

图片来源于网络,如有侵权请私信

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值