动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.在Eclipse中建立自己的JUnit测试.
.Java 与 XML 结合使用的心得体会.
.使用JNI集成java与native程序.
.文件名到URL的转换.
.IBM 发布Java字节码分析工具.
.Weblogic Server9新特性:J2.
.VisualAge for Java开发Servlets.
.谨防Java网络编程“陷阱”.
.Java中的functor实现.
.传言乍起,谁将收购SUN?.
.Java基础:关于Java编程语言中的.
.如何用SQL生成SQL批处理文件的方.
.Java Servlet 编程及应用之四.
.openfans领域模型驱动的尝试.
.应用Nokia UI API处理声音问题.
.Java发展趋势:走在最前线的脚本.
.Java 建模:子整体软件开发.
.Effective Java读书笔记之五.
.JAVA经验谈:尽可能使用堆栈变量.
.Java教程.

与垃圾收集器(Garbage Collector)为伴

发表日期:2008-1-5 |



垃圾收集器(Garbage Collector(GC))是一直伴随着 Java 程序员的最有争议的问题之一。我们接受了独立的收集器的原则,但是控制该收集器的迫切需要经常被证实是不可抗拒的。典型情况下,您用好了一个或多个资源,并指望它们会被回收。但它们并没有被回收。一定出现了问题!IBM 为我们提供了一种强行执行 GC 的方法 ? 调用 System.gc(),那么使用这一调用就一定没有问题,是这样吗? 错。几乎总是错的。

GC 称为“内存治理器”会更好,因为这是它真正做的事情。同 C/C++ 一样,它根据应用程序的请求分配内存。但是与 C/C++ 不同的是,内存释放是 GC 单独执行的。因为内存治理的复杂性中 99% 与未使用内存的自动定位及释放有关。一般我们提到“GC”就是指 Java 内存治理。

Java 虚拟机(Java virtual machine(JVM))有它自己的内存池。我们不使用一般的本地方法,如 malloc。当然,这个内存池只是从本机 OS 中分配的一大块。Java 内存被称作堆。当 Java 对象需要内存时,就从堆中进行内存分配。

通常,JVM 在被要求时才对内存进行分配。当且仅当内存分配发生错误(内存溢出)时才执行 GC。

是的,是的,我知道 Java 1.1.8 有“异步 GC”操作。在 IBM Java SDK 中,这个循环实际上从未被激活。因为性能的缘故,异步 GC 操作被配置成只有在您的应用程序确实什么事也不做的时候才会运行。即使您的应用程序静止,也要经过相当长时间的超时,异步 GC 才会运行。在 Java 2 中已经没有异步操作了。

因此,对于 IBM Java SDK 来说,GC 完全是一个同步操作,而且仅在内存分配发生错误时才发生。

GC 的工作方式
我们当然不会完整地讨论这些内容;关于这一主题已经有整本专著问世了。我们只要讨论基础知识。

GC 通过扫描 JVM 里运行的所有线程的堆栈和寄存器来执行。假如它发现有些东西似乎是对 Java 堆内的引用,GC 将会继续查下去。假如该引用确实是对对象的引用,那么 GC 将跟随该对象内的所有引用。被引用的对象以及该对象所引用的所有对象都将被“标记”(或标志)。

显然,只有在线程被中止的情况下它才能起作用,因此,GC 要停止 JVM 里的所有线程才能开始执行,当然,其中不包括它正在其上运行的那个线程。

标记阶段结束时,GC 会扫描堆,并对照在标记阶段标志的那些对象检查堆里的所有对象。任何没有被标记的对象都是没有被任何线程引用的对象,因而,这些对象将会被回收并被放回到空闲池。

此处需要指出的重点是:

GC 是一个停止一切的操作。
GC 是一个同步操作。
GC 需要扫描每个线程的堆栈。
GC 需要扫描整个 Java 堆。
就 CPU 使用和时间而言,GC 操作代价高昂。这就是我们要尽可能减少它的执行的原因。虽然它效率极高,但在一个有许多线程并且堆的大小达多兆字节的环境中运行需要时间。

这解释了相当常见的说法 -“我的对象在应该被回收的时候并没有被回收”。它们符合被回收的条件;可是没有必要运行 GC,所以它并没有执行。

System.gc()
System.gc() 是“内存分配错误是运行 GC 的唯一原因”这一规则的一个例外。

虽然这可能是一种例外情况,但并不是一个好主意。请相信我。

文档说明该调用设置了一个标志,该标志表明在 JVM 非常想要时可以运行 GC。System.gc() 调用实际上做的事情是:假如调用它的时候有一个 GC 循环正在运行,那么就?略这次调用;否则,就开始一次完整的 GC 循环。

这就是说,每次(或 99.9% 次)调用 System.gc() 的时候,您都会开始一个完整的 GC 循环。也许根本没有必要运行 GC,但是您还是强行让它执行完整个标记/扫描过程。您完全可以把 System.gc() 看作是 System.StopEverythingForAWhile() 调用或 System.SlugMyPerfomance() 调用。

对于这个调用,有一个可能的正当理由。因为假如没有这个调用,直到堆用完 GC 才会运行。假如您有一个千兆字节的堆,在 GC 清理全部垃圾时,您将遭到相当大的打击,然后您可能会考虑以固定间隔强行执行一个 GC 循环以达到“少量多次”的效果。但是,在这种情况下,您考虑调整堆的大小会更好些。

我们为什么要强行执行 GC?
到处散布 System.gc() 调用的诱惑非常大。在某一阶段,我们总是碰到“内存溢出”的问题,第一反应是认为 GC 出了问题,并强行执行一个循环。尽管这经常能改善局面(至少是暂时能),并且似乎验证了“GC 出了问题”这一想法,但事实也许并非如此。

请记住,GC 处于食物链的底部。由于 GC 的常规操作是彻底检查系统运行时的状态,所以代码中其它地方所犯的错误经常会被 GC 暴露出来。这样,别处所犯的错误导致 GC 没有响应,而程序员认为 JVM 是在 GC 处异常结束的。因此,应该是 GC 的问题。追查要从定位问题开始,因此,我们强行让 GC 在代码中的不同地方执行。不幸的是,一旦了解了 GC 查出的问题的真相,我们总是会忘记删除所有那些 System.gc() 调用。

在一天结束时,最终在您的代码中会有成十、成百或者上千个强行执行 GC 的调用(您有多少个呢?)。除了缓慢的性能和在强制执行的非必要 GC 循环上花费过多的时间之外,这使您一无所获。当答应 GC 按您预想的那样运行时,您可能会感到吃惊,一个劣等系统的响应速度也如此之快。
上一篇:邮件例程 人气:428
下一篇:于有状态和无状态会话bean的解释 人气:512
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-12-2 OpenPNE中文 v2.12.5 for win 中
2008-12-2 谷秋精品课程软件课程版 v2.3
2008-12-2 晴天电影系统(带一键迅雷/自定义
2008-12-2 QQip138闪字程序
2008-12-2 SmartWeb企业智能建站系统 v1.0.2
2008-12-2 梦想不死个人主页 v2009
2008-12-2 开良ASP小偷程序生成器 v1.1
2008-12-2 toolxp.cnalexa世界排名查询 php
2008-12-2 腾讯留言板 v1.3
2008-11-29 Tencent Traveler 4.4
2008-11-29 龙卷风网络收音机 v3.0.0.0
2008-11-29 Intel Chipset Software Install
2008-11-29 TweakVI 1.0 Build 1100
2008-11-29 Opera 9.62 Build 10469
2008-11-29 MPlayer WW编译版 SVN-r28044(20
2008-11-29 NetTools网络工具v1.0.0破解版
2008-11-29 3DGallery三维体验1.1破解版
2008-11-29 SecretBook保密本v1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | OPEN参数生成器 | 弹出式窗口代码产生器 | 密码登录生成器 | 在线按钮生成器 | Meta标签生成器 | 多色彩特效字代码生成器 | 网页代码调试器 | 在线FTP登陆 | Flash取色器 | 配色代码对照表 | 配色辞典 | CSS生成器 | 广告代码 | 框架网页代码生成器 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | 在线调色板 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 元素周期表 | 健康查询 | 世界时间 | 万年历 | 二十四节气 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2009 www.knowsky.com All rights reserved | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成