JVM调优之探索CMS和G1的物理内存归还机制

本文通过一个资产统计系统的案例,探讨了CMS和G1垃圾回收器在物理内存归还上的差异。CMS在多次System.gc()后逐渐归还内存,而G1在每次垃圾回收后立即归还所有剩余内存,降低了内存占用。建议使用JProfiler和VisualVM来监控Java堆栈。
摘要由CSDN通过智能技术生成

前言:

公司有一个资产统计系统,使用频率很低,但是要求在使用时查询速度快,因此想到做一些缓存放在内存中,在长时间没有使用,就持久化到磁盘中,并对垃圾进行回收,归还物理内存给操作系统,从而节省宝贵资源给其它业务系统。当我做好缓存时,却发现了一个棘手的问题,通过程序释放资源并通知GC回收资源后,堆内存的已用内存减少了,空闲内存增加了,可是进程占用系统内存却没有减少。查阅了很多资料,也尝试过很多次,都没有完美解决问题。直到后来看到一段评论谈及G1垃圾回收器,才恍然大悟。

接下来,通过一个小demo给大家演示一下两种垃圾回收器对物理内存归还的区别。如果有什么不对的地方,希望大家能够在评论里面指正。

  • 堆大小配置:

-Xms128M -Xmx2048M

先附上测试代码:

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class MemoryRecycleTest {
   

    @Test
    public void testMemoryRecycle() throws InterruptedException {
   

        List list = new ArrayList();

        //指定要生产的对象大小为512m
        int count = 512;

        //新建一条线程,负责生产对象
        new Thread(() -> {
   
            try {
   
                for (int i = 1; i <= 10; i++) {
   
                    System.out.println(String.format("第%s次生产%s大小的对象", i, count));
                    addObject(list, count);
                    //休眠40秒
                    Thread.sleep(i * 10000);
                }
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
        }).start();

        //新建一条线程,负责清理list,回收jvm内存
        new Thread(() -> {
   
            for (;;) {
   
                //当list内存到达512m,就通知gc回收堆
                if (list.size() >= count) {
   
                    System.out.println("清理list.... 回收jvm内存....");
                    list.clear();
                    //通知gc回收
                    System.gc();
                    //打印堆内存信息
                    printJvmMemoryInfo();
                }
            }
        }).start();

        //阻止程序退出
        Thread.currentThread().join();
    }

    public void addObject(List list, int count) {
   
        for (int i = 0; i < count; i++) {
   
            OOMobject ooMobject = new OOMobject();
            //向list添加一个1m的对象
            list.add(ooMobject);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值