- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅析JAVA之垃圾回收机制
分类: JAVA应用开发 JVM 2010-05-22 22:03 401人阅读 评论(2) 收藏 举报
对于JAVA编程和很多类似C、C++语言有一个巨大区别就是内存不需要自己去free或者delete,而是由JVM垃圾回收机制去完成的。对于这个过程很多人一直比较茫然或者觉得很智能,使得在写程序的过程不太考虑它的感受,其实知道一些内在的原理,帮助我们编写更加优秀的代码是非常有必要的;本文介绍一些JVM垃圾回收的基本知识,后续的文章中会深入探讨JVM的内在;首先在看文章之前大家需要知道为什么要写JVM垃圾回收,在Java发展以来,由于需要面向对象,而屏蔽掉程序员对于底层的关心,所以在性能上存在很多的缺陷,而通过不断改良,很多缺陷已经逐渐的取消掉了,不过还是依然存在很多的问题,其中最大的一块问题就是JVM的垃圾回收机制,一直以来Java在设计实时系统上都被骂声重重,就是因为垃圾回收存在非常多的问题,世界上目前还没有任何一个垃圾回收机制可以做到无暂停,而只是某些系统可以做到非常少的暂停;本文还不会讨论那么深入的只是,就简单的内部认识做一些概要性的介绍。
?
本文从以下几个方面进行阐述:
1、finalize()方法
2、System.gc()方法及一些实用方法
3、JAVA如何申请内存,和C、C++有何区别
4、JVM如何寻找到需要回收的内存
5、JVM如何回收内存的(回收算法分解详述)
6、应用服务器部署及常用参数设置
7、扩展话题JIT(即时编译技术)与lazy evaluation(惰性评估),如何在应用服务器中控制一些必要的信息(小小代码参考)
?
?
1、finalize()方法:
???? 为了说明JVM回收,不得不先说明一个问题就是关于finalize()方法,所有实体对象都会有这个方法,因为这个Object类定义的,这个可能会被认为是垃圾回收的方法或者叫做析构函数,其实并非如此。finalize在JVM内存会收前会被调用(单并非绝对),而即使不调用它,JVM回收机制通过后面所述的一些算法就可以定位哪些是垃圾内存,那么这个拿来干什么用呢?finalize()其实是要做一些特殊的内存回收操作,如果对JAVA研究稍微多一点,大家会发现JAVA中有一种JNI(Java native interface),这种属于JAVA本地接口调用,即调用本地的其他语言信息,JAVA虚拟机底层掉调用也是这样实现的,这部分调用中可能存在一些对C、C++语言的操作,在C和C++内部通过new、malloc、realloc等关键词创建的对象垃圾回收机制是无能为力的,因为这不是它要管理的范围,而平时这些对象可能被JAVA对应的实体所调用,那么需要在对应JAVA对象放弃时(并不代表回收,只是程序中不使用它了)去调用对应的C、C++提供的本地接口去释放这段内存信息,他们的释放同样需要通过free或delete去释放,所以我们一般情况下不要滥用finalize(),个人建议是最好不要用,所有非同类语言的调用不一定非要通过JNI来完成的,或者调用完就直接释放掉相应的内容,而不要寄希望于finalize这个方法,因为JVM不保证什么时候会调用这个方法。
2、System.gc()或者Runtime.getRuntime().gc();
这个可以被认为是强制垃圾回收的一种机制,但是并非强制回收,只是向JVM建议可以进行垃圾回收,而且垃圾回收的地方和多少是不能像C语言一样控制,这是JVM垃圾回收机去控制的。程序中尽量不要是去使用这些东西,除自己开发一些管理代码除外,一般由JVM自己管理即可。
这里顺便提及几个查看当前JVM内存的几个简单代码方法(在JVM监控下有很多的工具,而且不同的厂商也有自己不同的工具,不过后续大部分关于java的文章都是只提及到:Hotspot VM的版本,其他的版本可能只是略微说明下):
2.1.设置的最大内存:-Xmx等值:
(Runtime.getRuntime().maxMemory()/ (1024 * 1024)) + MB
2.2.当前JVM可使用的内存,这个值初始化和-Xms等值,若加载东西超过这个值,那么以下值会跟着变大,不过上限为-Xmx,由于变动过程中需要将虚拟内存做不断的伸缩过程,所以我们推荐服务器:是-Xms等价于-Xmx的值:
(Runtime.getRuntime().totalMemory()/ (1024 * 1024)) + MB
2.3.剩余内存,在当前可使用内存基础上,剩余内存等价于其剪掉使用了的内存容量:
(Runtime.getRuntime().freeMemory()/ (1024 * 1024)) + MB
?
同理如果要查看使用了多少内存或者百分比。可以通
您可能关注的文档
最近下载
- 个体工商户登记(备案)申请书.doc VIP
- 2024年新疆农业大学招聘事业编制人员考试真题.docx VIP
- 工业领域视觉大模型落地实践.pdf VIP
- TNAHIEM 121-2024 创伤中心建设与设备配置规范.docx VIP
- 统编版六年级上册语文《宇宙生命之谜》【精华版】课件完整版.pptx VIP
- 2023年新疆农业大学招聘事业编制工作人员31人笔试备考试题及答案解析.docx VIP
- 地铁主体结构顶板回填收土施工方案.doc VIP
- 基坑围护土方开挖监理细则.doc VIP
- 考研真题 安徽工业大学830化工原理历年考研真题.docx VIP
- 2025新疆农业大学第一批招聘事业编制工作人员(40人)笔试备考试题及答案解析.docx VIP
文档评论(0)