1. 现在我们一起来看一个看起来幼稚但却又很容易被人忽略的程序:
程序要求:创建一个大小为 100 MB 的byte类型的数组:<o:p></o:p>
public class OutOfMemory<o:p></o:p>
{<o:p></o:p>
public static void main(String args[])<o:p></o:p>
{<o:p></o:p>
byte b = new byte[1024*1024*100] ;<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
运行会报出如下的错误 : OutOfMemoryError: Java heap space
<o:p></o:p>
(实际上是在byte[]的大小不能超过58 MB ,对于 int[] 类型的大小不能超过14 MB ,也就是说不同类型的数组的最大length 的限度也是不同的)<o:p></o:p>
<o:p> </o:p>
<v:shapetype o:spt="75" coordsize="21600,21600" stroked="f" id="_x0000_t75" filled="f" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path gradientshapeok="t" o:extrusionok="f" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape type="#_x0000_t75" id="_x0000_i1025" style="WIDTH: 405pt; HEIGHT: 209.25pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1.IBM\LOCALS~1\Temp\msohtml1\01\clip_image001.jpg" o:title="OutOfMemory"></v:imagedata></v:shape><o:p></o:p>
解析:<o:p></o:p>
java.lang.OutOfMemoryError: ( 内存不足)
Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector<o:p></o:p>
( JAVA 虚拟机没有足够的内存分配给对象,垃圾收集器也没有多余的内存可供使用时,将报出 java.lang.OutOfMemoryError , )<o:p></o:p>
<o:p> </o:p>
呵呵 !看到这或许有人会说谁会犯这么低级的错误啊 ?但是想想你在平时是不是经常用到一些类似这样的语句: <o:p></o:p>
InputStream xmlStream = new FileInputStream("data/workflow1.xml");<o:p></o:p>
byte[] datas = new byte[xmlStream.available()];<o:p></o:p>
呵呵。在看这些程序的时候是不是觉得是那么的眼熟,那么的合理可是细想想是不是有可能和我们上面的程序犯同样的一个错误 ?呵呵 !<o:p></o:p>
<o:p> </o:p>
不过这样的程序给了我另一个想法 :<o:p></o:p>
思考:<o:p></o:p>
no more memory could be made available by the garbage collector:<o:p></o:p>
(?):也就是说在程序抛出异常之前应该会去调用了System. finalize( )方法,回收一些不再使用的对象吗?呢么我们可以怎么应用 java.lang.OutOfMemoryError ?能不能用OutOfMemoryError来管理对象的生命周期呢 ?<o:p></o:p>
<o:p> </o:p>
先试试看:JAVA自带的垃圾回收机制,是不是能够及时的进行垃圾回收 ?<o:p></o:p>
例子1:<o:p></o:p>
public class Person
{
<o:p> </o:p>
public void finalize()
{
System.out.println("The object is going !");
}
/**
* main( ) 中创建了三个 Person( )
*/
public static void main(String[] args)
{
new Person();<o:p></o:p>
new Person();<o:p></o:p>
new Person(); <o:p></o:p>
// new Person(); 读者可以将这行的注释符号去掉,再运行试试 ,将有另一个结果!<o:p></o:p>
System.out.println("The program is ending !");
<o:p> </o:p>
}
}<o:p></o:p>
运行结果:<o:p></o:p>
<v:shape type="#_x0000_t75" id="_x0000_i1026" style="WIDTH: 414.75pt; HEIGHT: 213pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1.IBM\LOCALS~1\Temp\msohtml1\01\clip_image003.png" o:title=""></v:imagedata></v:shape>
<o:p> </o:p>
<o:p> </o:p>
(?)这是怎么回事啊 ?finalize() 怎么没有被调用啊 ?<o:p></o:p>
原来, JAVA的垃圾回收机制是非常懒惰的,只有在对象向堆所请求的内存不足时,垃圾收集器(Garbage Collector)才会启动,释放那些引用数为零的对象所占用的内存,Java不会自动释放无用的对象的引用。
<o:p> </o:p>
那么我们修改例子1代码:
import java.lang.Exception;
<o:p> </o:p>
public class Person
{
<o:p> </o:p>
public void finalize()
{
System.out.println("The object is going !");
}
<o:p> </o:p>
public static void main(String[] args)throws Exception
{
new Person(); <o:p></o:p>
try<o:p></o:p>
{<o:p></o:p>
int by[] = new int[1024*1024*15];<o:p></o:p>
System.out.println("OK");<o:p></o:p>
}<o:p></o:p>
catch(Exception e)<o:p></o:p>
{<o:p></o:p>
e.printStackTrace();<o:p></o:p>
} <o:p></o:p>
}
}
查看运行结果:
<v:shape type="#_x0000_t75" id="_x0000_i1027" style="WIDTH: 414.75pt; HEIGHT: 293.25pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1.IBM\LOCALS~1\Temp\msohtml1\01\clip_image005.png" o:title="3"></v:imagedata></v:shape>
看来java.lang.OutOfMemoryErr帮助我们收垃圾了 !(只不过这个收垃圾的工资要求太高了)。
<o:p> </o:p>
思考:( 想法不一定可行 )<o:p></o:p>
我们可否用 Error 或者 Exception 来控制对象的生命周期呢 ,象OutOfMemoryErr 这样收垃圾的未免有点太高销了,怎么寻找一个低廉的Err 或者 Exception ?<o:p></o:p>
分享到:
相关推荐
本系列课程从JVM基础到高级实战,老师手把手教你如何进行JVM调优,思路清晰,没有废话,旨在挑战高薪。 课程亮点: 1、基于阿里arthas进行JVM调优; 2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路;...
《解忧程序员:高薪编程、求职面试与成长转型宝典》是一本专门为程序员提供职业发展指导的书籍,作者安晓辉通过浅显易懂的语言和深入浅出的讲解,帮助程序员解决在技术工作中遇到的各种问题。这本书不仅涵盖了编程...
【华为的高薪策略及其企业家精神】 华为是中国知名的电信设备制造商和全球领先的信息与通信技术解决方案提供商,其独特的管理模式和企业家精神备受业界关注。其中,华为的高薪政策是其吸引和留住人才的重要手段,...
很抱歉,但根据您给出的信息,标题"对高薪养廉的几点思考-论文.zip"和描述中的内容并不属于IT行业的知识范畴。这个主题通常涉及经济学、社会学或公共政策,而不是信息技术。同样,标签"论文"也指向学术研究而非IT...
### 电子书籍-职场黄金五年的薪酬规划:五年跨入高薪族 #### 知识点解析 **一、引言** 《史记·货殖列传》中的名言“天下熙熙,皆为利来,天下攘攘,皆为利往”与“无利不起早”的古语揭示了一个普遍真理——追求...
下载一个cebx阅读器即可 《Android高薪之路:Android程序员面试宝典》目录: 第1章 Android入门 1 1 关于Android的非技术问题 1 1 1 为什么看好 Android 1 1 2 以前是否从事过Android的工作 做过哪些工作 1 1 3 你...
《高薪运营成长图谱》是一本针对运营人员,尤其是初入行者和有一定经验的职场人的实用指南。这本书的核心目标是帮助读者掌握从产品营销到业务增长的关键技能,从而实现职业上的快速晋升和薪资的提升。以下是书中涵盖...
本资源是老男孩教育安全工程师2019大纲的课程概要,旨在帮助有志向的年轻人通过努力获得高薪就业梦想。该课程涵盖了高端Linux、Python、安全培训领导者等技术领域,并提供了企业级阿里云实战环境和真实服务器环境...
Android高薪之路:Android程序员面试宝典-李宁(高清PDF完整版)、 C#与.NET程序员面试宝典-靳华(高清PDF扫描版)、 C与C++程序员面试宝典-梁镇宇(高清PDF扫描版)、 Java程序员面试宝典(第二版)-欧立奇(PDF...
finalize()是Object类的一个方法,在垃圾收集器执行时可能会被调用,用于回收资源。 8. J2EE常用设计模式:常见的设计模式包括单例模式、工厂模式、代理模式、策略模式等,每种模式都适用于解决特定类型的设计问题...
就是一个高薪面试的题目集合就是一个高薪面试的题目集合就是一个高薪面试的题目集合就是一个高薪面试的题目集合就是一个高薪面试的题目集合就是一个高薪面试的题目集合就是一个高薪面试的题目集合就是一个高薪面试的...
你也能拿高薪:名企面试自助手册 你也能拿高薪:名企面试自助手册
### 脉脉高聘:2024春招高薪职业和人才洞察报告 #### 知识点一:2024年第一季度求职压力与薪资变动情况 **背景介绍:** - **时间范围:**2022年-2024年3月。 - **数据来源:**脉脉高聘人才智库。 **核心数据:** ...
本书共八章,前六章可以作为实现高薪网管的职业成长“六部曲”,分别是:正确职业观的树立、技能水平差距的查找、适宜职业规划的制定、正确学习观念和方法的确定、毕业找工作/面试经验和技巧的把握,以及自己创业...
链接: https://pan.baidu.com/s/1RYZd-7YfD3QgflKQDm38wg 提取码: k0ji --大前端高薪训练营百度云【百度云网盘】
在当前快速变化的职场环境中,高薪族的保值增值策略变得至关重要。本文将深入探讨这一主题,结合案例分析和专家建议,为面临职业生涯危机的高薪人士提供一些实用的应对之道。 首先,我们要理解“高薪一族”的形成...
问题在于,人们是更倾向于高薪但工作时间长的工作,还是普通薪资且工作时间正常的工作,这往往因个人背景和性格差异而有不同的看法。我个人认为,对于这个长期存在的争论,我的选择将取决于我处于人生中的哪个阶段。...
【全国高薪OA完整版8单元】是针对全国计算机高薪技能考试的专项学习资源,包含8个单元的完整内容,旨在帮助考生全面掌握并熟练应用相关知识,以期在考试中取得优异成绩。这个资源的独特之处在于它声称所有题目都已经...
在IT行业中,一份精心制作的高薪简历是开启成功职业生涯的关键。"IT高薪简历模板.zip"这个压缩包文件提供了一系列宝贵的资源,帮助求职者打造一份吸引眼球的简历,提高获得理想职位的机会。以下是根据标题、描述以及...
- P90:高薪职位的薪酬为233,635元,显示虽然起点低,但仍有部分高薪机会。 4. 国有企业(State-Owned Enterprises): - P25:薪酬起点在140,414元。 - P50:中位数为205,722元,表明国有企业的平均薪酬水平...