linux服务器gc回收,关于GC进行垃圾回收的时机

前言

今天查看一个同事的代码,发现代码中多处地方使用了GC.Collect()方法,我问他为什么这么做,他说感觉程序中定义了好多变量,怕GC回收不及时,用GC.Collect()可以手动掌控GC进行垃圾回收。

先不说他对GC的垃圾回收机制还不了解,就是调用GC.Collect()后GC真的会不会回收这个问题都需要再深入了解一下。

GC.Collect

下面我们通过一个小例子,来看一下使用GC.Collect后的内存情况。

我们知道可以通过GCHandle设置引用类型(可直接复制到本机结构中的类型)在GC垃圾回收时不移动地址,并且获取地址值,那么就可以通过在两次地址获取中间加入Collect方法,来判断GC是否真的进行了垃圾回收。

using System;

using System.Runtime.InteropServices;

namespace TestGCCollect

{

class Program

{

static void Main(string[] args)

{

//创建一个没有引用的垃圾对象

new object();

//这是我们要判定地址的对象

int[] gcTest = new int[];

//设定Pinned通知GC在进行回收的时候不移动地址

GCHandle gcHandle1 = GCHandle.Alloc(gcTest, GCHandleType.Pinned);

//获取gcTest在堆中的地址并输出

IntPtr add1 = gcHandle1.AddrOfPinnedObject();

Console.WriteLine(add1.ToString());

//通知GC当程序返回的时候可以回收

gcHandle1.Free();

//调用GC回收object垃圾

GC.Collect();

//再次获取地址

GCHandle gcHandle2 = GCHandle.Alloc(gcTest, GCHandleType.Pinned);

IntPtr add2 = gcHandle2.AddrOfPinnedObject();

Console.WriteLine(add2.ToString());

gcHandle2.Free();

Console.ReadKey();

}

}

}

815d1e3ebc226d61688508e2b5fa7f4e.png

我们发现地址并没有变化!

修改一下代码使用for循环生成多个object:

//创建没有引用的垃圾对象

for (int i = ; i < ; i++)

new object();

//这是我们要判定地址的对象

int[] gcTest = new int[];

重新编译后,执行结果如下:

149b2cd2f5eb3b94a2cf0d9b88d08911.png

地址变了!

通过上面的代码,我们知道GC.Collect并不是只要执行就会进行垃圾回收,实际上GC会首先判断当前是不是真的需要进行回收,如果内存中只有很小的垃圾(碎片化不严重)时,这时候启动回收显然得不偿失,影响性能。

总结

1. 永远都不要手动进行GC.Collect操作。如果你认为有,需要检查你地代码

2. 即使当你手动进行垃圾回收时,GC还不会立即执行,它要先判断是否真正需要回收

java&colon; system&period;gc&lpar;&rpar;和垃圾回收机制finalize

System.gc()和垃圾回收机制前的收尾方法:finalize(收尾机制) 程序退出时,为每个对象调用一次finalize方法,垃圾回收前的收尾方法 System.gc() 垃圾回收方法 clas ...

【转载】Java性能优化之JVM GC(垃圾回收机制)

文章来源:https://zhuanlan.zhihu.com/p/25539690 Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我 ...

Java性能优化之JVM GC(垃圾回收机制)

Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.st ...

Java GC(垃圾回收)机制知识总结

目录 Java GC系列 Java关键术语 Java HotSpot 虚拟机 JVM体系结构 Java堆内存 启动Java垃圾回收 Java垃圾回收过程 垃圾回收中实例的终结 对象什么时候符合垃圾回收 ...

gc roots 垃圾回收

gc roots包括以下几个: 虚拟机栈(栈桢中的本地变量表)中的引用对象 方法区中的类静态属性引用的对象 方法区中的常量引用的对象 本地方法栈中JNI(即native方法)的引用的对象 java,c ...

GC(垃圾回收)

Java程序的内存分配和回收都是由JRE在后台自动进行的.JRE会负责回收那些不再使用的内存,这种机制被称为垃圾回收GC.通常JRE会提供一条超级线程来进行检测和控制,一般都是在CPU空闲或内存不足时 ...

jvm GC:垃圾回收的测试与分析

实验环境: (1)Java版本以及模式: java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0 ...

关于GC(垃圾回收)

当我用new创建一个对象时,当可分配的内存不足GC就会去回收未使用的对象,但是GC的操作是非常复杂的,会占用很多CPU时间,对于移动设备来说频繁的垃圾回收会严重影响性能.下面的建议可以避免GC频繁操作 ...

随机推荐

transformClassesWithDexForDebug

转自:http://blog.sina.com.cn/s/blog_6f3828770102w30b.html

&lbrack;转&rsqb;MyEclipse 里查看jar文件源码

在开发过程中,有时候需要查看jar文件的源码,这里讲解如何设置.  选中某一个jar文件,如我这里选中的是struts2-core-2.1.6.jar,然后右键-->Properties--&g ...

tomcat启动指定项目

看一下server.xml,conf/localhost/,web.xml是否配置了其他的WEBAPP应用,但实际地址已经被移除,清空WORK目录试试 http://blog.163.com/mous ...

Windows7系统下JAVA运行环境下载、安装和设置(第二次更新:2012年03月14日)

1.下载 地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html,(由于Sun于2009年被oracle收购所以网址 ...

Qt5&plus;VS2013兼容XP方法

用Qt5+VS2013编译程序默认配置会在XP运行时报"不是有效的Win32程序"工作需要必须要XP运行 pro文件中加一句: 复制代码 QMAKE_LFLAGS_WINDOWS ...

响应式web之媒体查询(一)

HTML4和css2目前支持为不用的媒体类型设定专有的样式,如,一个页面在屏幕上时使用无衬线字体,而在打印时使用衬线字体.screen和print是两种已定义的媒体类型.媒体查询让样式表有更强的针对性 ...

EJB系列 - 会话Bean基础知识

本人博客文章网址:https://www.peretang.com/basic-knowledge-of-session-bean/ 什么是会话 有限的时间周期内,客户端和服务器之间的连接 为什么使用 ...

mysql中Table is read only的解决方法

首先去到mysq的bin目录 cd /usr/local/mysql/bin 执行如下mysqladmin ./mysqladmin -p flush-tables 接着输入数据库存的root密码即可

Spark2&period;1&period;0模型设计与基本架构(下)

阅读提示:读者如果对Spark的背景知识不是很了解的话,建议首先阅读一文. Spark模型设计 1. Spark编程模型 正如Hadoop在 ...

Linux中wget用法

Wget简介:Linux系统中wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器.wget支持HTTP,HTTP ...

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值