??xml version="1.0" encoding="utf-8" standalone="yes"?> 一.CSRF是什么? CSRFQCross-site request forgeryQ,中文名称Q跨站请求伪造,也被UCؓ(f)Qone click attack/session ridingQ羃写ؓ(f)QCSRF/XSRF?/p> ?CSRF可以做什么? 你这可以q么理解CSRFdQ?span style="line-height: 1.8; color: #ff0000;">d者盗用了(jin)你的w䆾Q以你的名义发送恶意请?/span>。CSRF能够做的事情包括Q以你名义发送邮Ӟ发消息,盗取你的账号Q甚至于购买商品Q虚拟货币{?.....造成的问题包括:(x)个h隐私泄露以及(qing)财安全?/p> ?CSRF漏洞现状 CSRFq种d方式?000q已l被国外的安全h员提出,但在国内Q直?6q才开始被x(chng)Q?8q_(d)国内外的多个大型C和交互网站分别爆出CSRF漏洞Q如QNYTimes.comQ纽U时报)(j)、MetafilterQ一个大型的BLOG|站Q,YouTube和百度HI......而现在,互联|上的许多站点仍Ҏ(gu)毫无防备Q以至于安全业界UCSRF?#8220;沉睡的巨?#8221;?/p> ?CSRF的原?/strong> 下图单阐qC(jin)CSRFd的思想Q?/p> 从上囑֏以看出,要完成一ơCSRFdQ?span style="line-height: 1.8; color: #0000ff;">受害者必Mơ完成两个步?/span>Q?/p> 1.d受信ȝ站AQƈ在本地生成Cookie?/p> 2.在不dA的情况下Q访问危险网站B?/p> 看到q里Q你也许?x)说Q?#8220;如果我不满以上两个条g中的一个,我就不会(x)受到CSRF的攻?/span>”。是的,实如此Q但你不能保证以下情况不?x)发生?x) 1.你不能保证你d?jin)一个网站后Q不再打开一个tab面q访问另外的|站?/p> 2.你不能保证你关闭览器了(jin)后,你本地的Cookie立刻q期Q你上次的会(x)话已l结束。(事实上,关闭览器不能结束一个会(x)话,但大多数人都?x)错误的认?f)关闭览器就{于退出登?l束?x)话?.....Q?/p> 3.上图中所谓的d|站Q可能是一个存在其他漏z的可信ȝl常被h讉K的网站?/p> 上面大概地讲?jin)一下CSRFd的思想Q下面我用几个例子详细说说具体的CSRFdQ这里我以一个银行{账的操作作ؓ(f)例子Q仅仅是例子Q真实的银行|站没这么傻:>Q?/p> CZ1Q?/span> 银行|站AQ它以GETh来完成银行{账的操作Q如Qhttp://www.mybank.com/Transfer.php?toBankId=11&money=1000 危险|站BQ它里面有一DHTML的代码如下:(x) 首先Q你d?jin)银行网站AQ然后访问危险网站BQ噢Q这时你?x)发C的银行̎户少?000?..... Z么会(x)q样呢?原因是银行网站Aq反?jin)HTTP规范Q用GETh更新资源。在讉K危险|站B的之前,你已l登录了(jin)银行|站AQ而B中的<img>以GET的方式请求第三方资源Q这里的W三方就是指银行|站?jin),原本q是一个合法的hQ但q里被不法分子利用了(jin)Q,所以你的浏览器?x)带上你的银行网站A的Cookie发出GethQ去获取资源“http://www.mybank.com/Transfer.php?toBankId=11&money=1000”Q结果银行网站服务器收到h后,认ؓ(f)q是一个更新资源操作(转̎操作Q,所以就立刻q行转̎操作...... CZ2Q?/strong> Z(jin)杜绝上面的问题,银行军_改用POSTh完成转̎操作?/p> 银行|站A的WEB表单如下Q 后台处理面Transfer.php如下Q?/p> 危险|站BQ仍然只是包含那句HTML代码Q?/p> 和示?中的操作一P你首先登录了(jin)银行|站AQ然后访问危险网站BQ结?....和示?一P你再ơ没?000块~T_TQ这ơ事故的原因是:(x)银行后台使用?_REQUEST去获取请求的数据Q?_REQUEST既可以获取GETh的数据,也可以获取POSTh的数据,q就造成?jin)在后台处理E序无法区分q到底是GETh的数据还是POSTh的数据。在PHP中,可以使用$_GET?_POST分别获取GETh和POSTh的数据。在JAVA中,用于获取h数据request一样存在不能区分GETh数据和POST数据的问题?/p> CZ3Q?/strong> l过前面2个惨痛的教训Q银行决定把获取h数据的方法也改了(jin)Q改?_POSTQ只获取POSTh的数据,后台处理面Transfer.php代码如下Q?/p> 然而,危险|站B与时pQ它改了(jin)一下代码:(x) 如果用户仍是l箋(hu)上面的操作,很不q,l果会(x)是再ơ不?000?.....因ؓ(f)q里危险|站B暗地里发送了(jin)POSTh到银? ȝ一下上?个例子,CSRF主要的攻?yn)L式基本上是以上的3U,其中以第1,2U最Z重,因ؓ(f)触发条g很简单,一?lt;img>可以了(jin)Q而第3U比较麻?ch),需要用JavaScriptQ所以用的Z(x)?x)比前面的少很多Q但无论是哪U情况,只要触发?jin)CSRFdQ后果都有可能很严重?/p> 理解上面?U攻?yn)L式,其实可以看出Q?span style="line-height: 1.8; color: #ff0000;">CSRFd是源于WEB的隐式n份验证机ӞWEB的n份验证机制虽然可以保证一个请求是来自于某个用L(fng)览器,但却无法保证该请求是用户批准发送的Q?/p> ?CSRF的防?/strong> 我ȝ?jin)一下看到的资料QCSRF的防御可以从服务?/span>?span style="line-height: 1.8; color: #3366ff;">客户?/span>两方面着手,防M效果是从服务端着手效果比较好Q现在一般的CSRF防M也都在服务端q行?/p> 1.服务端进行CSRF防M 服务端的CSRF方式Ҏ(gu)很多P但ȝ思想都是一致的Q就是在客户端页?span style="line-height: 1.8; color: #ff0000;">增加伪随机数 (1).Cookie Hashing(所有表单都包含同一个伪随机?Q?/p> q可能是最单的解决Ҏ(gu)?jin),因?f)d者不能获得第三方的Cookie(理论?Q所以表单中的数据也构造失败了(jin):> 在表单里增加Hash|以认证这实是用户发送的h?/p> 然后在服务器端进行Hash值验?/p> q个Ҏ(gu)个h觉得已经可以杜绝99%的CSRFd?jin),那还?%?...׃用户的Cookie很容易由于网站的XSS漏洞而被盗取Q这另外的1%。一般的d者看到有需要算Hash|基本都会(x)攑ּ?jin),某些除外Q所以如果需?00%的杜l,q个不是最好的Ҏ(gu)?br /> (2).验证?/p> q个Ҏ(gu)的思\是:(x)每次的用h交都需要用户在表单中填写一个图片上的随机字W串Q厄....q个Ҏ(gu)可以完全解决CSRFQ但个h觉得在易用性方面似乎不是太好,q有听闻是验证码囄的用涉?qing)?jin)一个被UCؓ(f)MHTML的BugQ可能在某些版本的微软IE中受影响?/p> (3).One-Time Tokens(不同的表单包含一个不同的伪随机? 在实现One-Time TokensӞ需要注意一点:(x)是“q行?x)话的兼?#8221;。如果用户在一个站点上同时打开?jin)两个不同的表单QCSRF保护措施不应该媄(jing)响到他对M表单的提交。考虑一下如果每ơ表单被装入时站点生成一个伪随机值来覆盖以前的伪随机值将?x)发生什么情况:(x)用户只能成功地提交他最后打开的表单,因ؓ(f)所有其他的表单都含有非法的伪随机倹{必d?j)操作以保CSRF保护措施不会(x)影响选项卡式的浏览或者利用多个浏览器H口览一个站炏V?/p> 以下我的实现: 1).先是令牌生成函数(gen_token())Q?/p> 2).然后是Session令牌生成函数(gen_stoken())Q?/p> 3).WEB表单生成隐藏输入域的函数Q 4).WEB表单l构Q?/p> 5).服务端核对o(h)牌:(x) q个很简单,q里׃再啰嗦了(jin)?/p> 上面q个其实不完全符?#8220;q行?x)话的兼?#8221;的规则,大家可以在此基础上修攏V?/p> 其实q有很多惛_Q无奈精力有限,暂且打住Q日后补充,如果错漏Q请指出:> PSQ今天下午写q篇文档的时候FF崩溃?jin)一ơ,写了(jin)一半文章的全没?jin),郁闷好久T_T....... 转蝲误明出处,谢谢[hyddd(http://www.cnblogs.com/hyddd/)] 一Q下载及(qing)安装 q样可以方便我们的使用?jin)?br style="padding: 0px; margin: 0px;" />如果是第一ơ用,我们首先的是要创建数据库Q也是存放密码的数据库QKeePass会(x)把你的所有密码存储在q个数据库中?br style="padding: 0px; margin: 0px;" />单击菜单上的“文g—新徏”Q选择数据库存攄路径 q里需要填入数据库理密码Qƈ要确认密码,我们同时要勾选上密匙文gQƈ选择密钥的保存(sh)|(可以选择不用密钥Q。这样将来在开启数据库时就?#8220;d?#8221;?#8220;密钥文g”同时具备才行。输入完毕后点击“定”然后点击创徏 在这里描q或者不描述都可以,点击定后就q入ȝ口ƈ可以看到一条示例记录,点击CZ记录在下方可以看到网址和密码ƈ且也创徏旉?a style="padding: 0px; margin: 0px; color: #aa752a;"> ȝ口的左边是密码群l,各个组又可建立子群l。右Ҏ(gu)你的密码记录。密码记录收U于不同的密码群l中。你可以使用Keepass默认的密码群l,或删除它们,创徏自己的密码组?/p> 在主H口双单击右键Q选择“d记录…”Q就可以~辑你的记录?jin)?x)记录标题Q用户名Q网址Q密码,备注{。可以空着不填。确认后完成了(jin)一条记录了(jin)Q在ȝ口右边的子窗口中看到刚才新增的密码条目?br style="padding: 0px; margin: 0px;" /> 当你再次使用q个文gӞ选中该条记录Q在记录上右击鼠标就可以真正使用它了(jin)。你可以用户名拯后,可以在其它的Q何Y件中_脓(chung)?jin),q可以将用户名拖攑ֈ其它H口中。最后,一定要C保存密码Q点?#8220;文g->保存”Q或工具栏上的保存按钮?/p> 提示Q随着数据库里的记录数目的逐步增多Q通过“~辑”菜单中的“在数据库中查?#8221;?#8220;在此组内查?#8221;命o(h)可以q速的扑ֈ要查的信息。另外,我们可以把数据库导出为TXT、HTML、XML、CSV{格式,导入CSV、TXT、KeePass数据库等格式的文件?/p> 三:(x)数据库的配置 点击“文g->数据库设|?#8230;”Q在弹出的窗口的选择“安全”按钮创徏一个加密算法,q设|密钥的加密ơ数Q如果选择生成密钥的话Q。通常加密ơ数的数量辑ֈ10万,也就_?jin)?br style="padding: 0px; margin: 0px;" /> 四:(x)Keepass数据的备?br style="padding: 0px; margin: 0px;" />首先要备份KeePass.exe所在目录中的KeePass.ini文g。其ơ,备䆾你所保存的密码数据库文gQ?.kdbQ。如果你生在?jin)密钥,q要保存密钥文g。以上文件打包后Q可以放入多动存储装|中Q或攑օ|络I间?br style="padding: 0px; margin: 0px;" />提示Q如果用L(fng)密码记录l常变动Q那么相应的KeePass数据也要l常备䆾。保存好你的数据。尽你有数不清的密码,但只需看好一个KeePass数据备䆾可以了(jin)?br style="padding: 0px; margin: 0px;" />五:(x)密码生成?br style="padding: 0px; margin: 0px;" />在添加记录时Q我们可以利用密码生成器来生成复杂的密码Q点?#8220;密码”右侧?#8220;生成”按钮Q调?#8220;密码生成?#8221;属性框Q然后,点击“定”按钮卛_自动生成随机密码。通过点击“***”按钮密码明文显C,清楚的看到由生成器所产生的字W串?br style="padding: 0px; margin: 0px;" /> 六:(x)Keepass常用讄 打开【工兗?>【选项…】,可以对Keepass作设|了(jin)?br style="padding: 0px; margin: 0px;" /> 我们现在生活中各个方面都需要用到密码,|站Q邮,论坛Q银行卡{等Q用keepass可以方便的ؓ(f)我们服务记录各种不同的密码,使我们的操作更加省时高效Q管理更方便安全?/p> 版权x(chng)Q?/strong> 葫芦博客(www.huluboke.com )专栏作家原创 VPS像一台服务器Q我们需要了(jin)解它的运行状态。虽然Linode控制面板已经有了(jin)很强大的监控图标功能Q但是还是不能满_?Ch的需求。这里我l大家推荐一个名为监控宝的服务,Linodel过单的配置可以支持SNMP监控Q以图表的Ş式监控CPU、IO和进E,能够自动?警,而且q一切都是免费的哦?/p> 目前提供的监控项?/strong> 有关更多的内容,误问:(x)http://blog.jiankongbao.com/?p=133 如何在Linode的VPS上配|监控宝SNMP监控 pȝ环境QCentos 5.6_32 我们可以使用yum命o(h)下蝲软g省去代码~译?ch)恼?/p> 1Q首先请关闭Centos的Selinux服务Q否则会(x)和snmp服务有冲H。关闭方法自行百度,很easy的?/p> 2Q在shell环境下,输入以下命o(h)Q?/p> 1、下载必要的SNMPlgQ以?qing)配|管理工P差不?0M 2、创建监控用P例如我创Z个用户名为jiankongbaoQ密码ؓ(f)123456的监控只读̎?/p> 3、启动SNMP服务q且加入开机启动(大约耗费5M内存Q?/p> 4、检SNMP是否正常开?/p> 如果q回cd容,p明SNMP服务已经配置好了(jin)?/p> 3Q配|SNMP服务安全问题 默认情况下,M机器可以通过SNMP服务的̎号密码通过UDP161端口q程获取服务器的状态,所以会(x)Ҏ(gu)务器安全产生威胁Q除?jin)徏立̎户和l̎ 户分配密码之外,q可以配合iptables只让监控宝的服务器访问Linode 的VPSQ彻底杜l安全隐(zhn)(账户密码+指定IP讉KSNMPl对专业U的安全Q?/p> 配置监控宝的iptablesQ只对监控宝的服务器开放SNMP?61QUDPQ端?/p> q样在服务器端SNMP的配|就O(jin)K?jin)?/p> 配置监控宝网站配|连接Linode的VPS 1Q在D条上方,d服务器监控,如图Q?/p> 名称LQIP填写(zhn)的Linode服务器IPQ服务器cd选择Linux/UNnix/Mac那一?/p> 2Q接下来填写SNMP服务的n份验证信?/p> 如果按照本文配置的话QSNMP传输协议版本选择3QSecurity Nmae是?zhn)刚才配置的用户名QPass Phrase是?zhn)刚才配置的密码(上文配置的?23456Q,验证选择MD5. 然后点击提交Q监控宝?x)验证(zhn)Linode VPS的SNMP讄Q需要稍{片刻,之后提示成功Q?/p> 如果不成功请(g)查是否填错了(jin)用户密码或者iptables生效?jin)没有?/p> 3Q下面选择监控目Q默认全部勾?/p> q样的话Q监控宝部分配|完成了(jin)Q过一阵子p看到监控信息?jin)。是不是很简单啊Q?/p> 本文固定链接: http://www.limutian.com/linode-vps-configure-the-monitor-snmp/ | LMT的那些事
]]>
<p>ToBankId: <input type="text" name="toBankId" /></p>
<p>Money: <input type="text" name="money" /></p>
<p><input type="submit" value="Transfer" /></p>
</form>
session_start();
if (isset($_REQUEST['toBankId'] && isset($_REQUEST['money']))
{
buy_stocks($_REQUEST['toBankId'], $_REQUEST['money']);
}
?>
session_start();
if (isset($_POST['toBankId'] && isset($_POST['money']))
{
buy_stocks($_POST['toBankId'], $_POST['money']);
}
?>
<head>
<script type="text/javascript">
function steal()
{
iframe = document.frames["steal"];
iframe.document.Submit("transfer");
}
</script>
</head>
<body onload="steal()">
<iframe name="steal" display="none">
<form method="POST" name="transfer" action="http://www.myBank.com/Transfer.php">
<input type="hidden" name="toBankId" value="11">
<input type="hidden" name="money" value="1000">
</form>
</iframe>
</body>
</html>
//构造加密的Cookie信息
$value = “DefenseSCRF”;
setcookie(”cookie”, $value, time()+3600);
?>
$hash = md5($_COOKIE['cookie']);
?>
<form method=”POST” action=”transfer.php”>
<input type=”text” name=”toBankId”>
<input type=”text” name=”money”>
<input type=”hidden” name=”hash” value=”<?=$hash;?>”>
<input type=”submit” name=”submit” value=”Submit”>
</form>
if(isset($_POST['check'])) {
$hash = md5($_COOKIE['cookie']);
if($_POST['check'] == $hash) {
doJob();
} else {
//...
}
} else {
//...
}
?>
function gen_token() {
//q里我是贪方便,实际上单使用Rand()得出的随机数作ؓ(f)令牌Q也是不安全的?br /> //q个可以参考我写的FindbugsW记中的《Random object created and used only once?/a>
$token = md5(uniqid(rand(), true));
return $token;
}
function gen_stoken() {
$pToken = "";
if($_SESSION[STOKEN_NAME] == $pToken){
//没有|赋新?br /> $_SESSION[STOKEN_NAME] = gen_token();
}
else{
//l箋(hu)使用旧的?br /> }
}
?>
function gen_input() {
gen_stoken();
echo “<input type=\”hidden\” name=\”" . FTOKEN_NAME . “\”
value=\”" . $_SESSION[STOKEN_NAME] . “\”> “;
}
?>
session_start();
include(”functions.php”);
?>
<form method=”POST” action=”transfer.php”>
<input type=”text” name=”toBankId”>
<input type=”text” name=”money”>
<? gen_input(); ?>
<input type=”submit” name=”submit” value=”Submit”>
</FORM>
]]>
站长癄下蝲站最新版下蝲地址Qhttp://down.zzbaike.com/download/KeePass–1257.htmlQ下载安装包解压后双d装文件根据安装向导就可以安装?br style="padding: 0px; margin: 0px;" />
选择I accept意思也是我同意,然后nextQ下一步)(j)Q根据提Clnext可以安装成功?br style="padding: 0px; margin: 0px;" />软g是英文的Q安装好之后我们看到界面仍旧都是英文的,我们可以去http://keepass.info/translations.htmlQ中下蝲体中文插件复制放到安装目录下Q运行Y?#8220;KeePass”Q点?#8220;View”菜单?#8220;Change Language”命o(h)Q选择“体中?#8221;重新启动E序卛_?/p>
二:(x)使用软g
l过上面的步骤,我们q回到桌面双击keepass的快捷键Q就可以看到软g的语a已经变成中文的了(jin)
选择一个\径来保存我们的数据库Q然后点M存,
鼠标在黑色区域划q生成的密码位数在下方可以很清楚的看刎ͼ然后点击定
?#8220;安全”选项卡中勾上Q设定锁定主H口旉Q?00Q自p|适合的时_(d)(j)
自动清空剪脓(chung)板时_(d)讄旉?U?br style="padding: 0px; margin: 0px;" />“高”选项卡中Ҏ(gu)需要勾上适合的选项?/p>
原文地址 http://www.huluboke.com/keepass-jiaocheng/转蝲请保留本版权信息
]]>1
yum install net-snmp net-snmp-devel net-snmp-utils
1
net-snmp-config --create-snmpv3-user -ro -A 1234565 jiankongbao
1
service snmpd start chkconfig snmpd on
1
snmpwalk -v 3 -u jiankongbao -a MD5 -A "123456" -l authNoPriv 127.0.0.1 sysDescr
1
iptables -I INPUT -p udp -s 60.195.252.107 --dport 161 -j ACCEPT
2
iptables -I INPUT -p udp -s 60.195.252.110 --dport 161 -j ACCEPT
3
service iptables save
4
service iptables restart
]]>
]]>
q是׃|页中含?lt;iframe>Q但iframe的src属性没有设|造成的?
解决该问题可用如下方法:(x)
客户端:(x)讄IE的属性。例Q在IE6上,工具-〉Internet选项-〉安全选项?〉自定义U别-〉将“昄混合内容”讄为启?卛_解决该问题。这个讨厌的对话框就不会(x)dC(jin)Q嘿ѝ?wbr>
?1. 无用但仍被引用的对象
上面说明?jin)?Java 应用E序执行期间h不同生存周期的两个类。类 A 首先被实例化Qƈ?x)在很长一D|间或E序的整个生存期内存在。在某个时候,c?B 被创建,c?A d对这个新创徏的类的一个引用。现在,我们假定c?B 是某个用L(fng)面小部gQ它qhC甚臌除。假如没有清除类 A ?B 的引用,则即便不再需要类 BQƈ且即便在执行下一个垃圾收集周期以后,c?B 仍将存在q占用内存空间?br />
何时应该x(chng)内存漏洞Q?br />
假如(zhn)的E序在执行一D|间以后发?java.lang.OutOfMemoryError 错误Q则内存漏洞肯定是一个重大嫌疑。除?jin)这U明昄情况之外Q何时还应该x(chng)内存漏洞呢?持完主义观点的E序员肯定会(x)回答Q应该查扑ƈU正 所有内存漏z。但是,在得?gu)个结Z前,q有几个斚w需要考虑Q包括程序的生存期和漏洞的大?br />
完全有这L(fng)可能Q垃圾收集器在应用程序的生存期内可能始终不会(x)q行。不能保?JVM 何时以及(qing)是否?x)调用垃圾收集?-- 即便E序昑ּ地调?System.gc() 也是如此。通常Q在当前的可用内存能够满程序的内存需求时QJVM 不会(x)自动q行垃圾攉器。当可用内存?sh)能满需求时QJVM 首先尝试通过调用垃圾攉来释攑և更多的可用内存。假如这U尝试仍然不能释放够的资源QJVM 从操作pȝ获取更多的内存,直至辑ֈ{应的最大极限?br />
例如Q考虑一个小?Java 应用E序Q它昄一些用于修攚w|的单用L(fng)面元素,q且它有一个内存漏z。很可能到应用程序关闭时也不?x)调用垃圾收集器Q因?JVM 很可能有_的内存来创徏E序所需的全部对象,而此后可用内存则所剩无几。因此,在这U情况下Q即使某?#8220;?#8221;对象在程序执行时占用着内存Q它实际上ƈ没有什么用途?br />
假如正在开发的 Java 代码要全?24 时在服务器上运行,则内存漏z在此处的媄(jing)响就比在我们的配|实用程序中的媄(jing)响要大得多。在要长旉q行的某些代码中Q即使最的漏洞也会(x)D JVM 耗尽全部可用内存?br />
在相反的情况下,即便E序的生存期较短Q假如存在分配大量(f)时对象(或者若q吞噬大量内存的对象Q的M Java 代码Q而且当不再需要这些对象时也没有取消对它们的引用,则仍然可能达到内存极限?br />
最后一U情冉|内存漏洞无关紧要。我们不应该认ؓ(f) Java 内存漏洞像其他语aQ如 C++Q中的漏z那样危险,在那些语a中内存将丢失Q且永远不会(x)被返回给操作pȝ。在 Java 应用E序中,我们使不需要的对象依附于操作系lؓ(f) JVM 所提供的内存资源。所以从理论上讲Q一旦关?Java 应用E序?qing)?JVMQ所分配的全部内存将被返回给操作pȝ?br />
定应用E序是否有内存漏z?br />
Z(jin)查看?Windows NT q_上运行的某个 Java 应用E序是否有内存漏z,(zhn)可能试囑֜应用E序q行时观?#8220;dȝ?#8221;中的内存讄。但是,在观察了(jin)q行中的几个 Java 应用E序以后Q?zhn)会(x)发现它们比本地应用E序占用的内存要多得多。我做过的一?Java 目要?10 ?20 MB 的系l内存才能启动。而操作系l自带的 Windows EXPlorer E序只需 5 MB 左右的内存?br />
?Java 应用E序内存?sh)用斚w应注重的另一Ҏ(gu)Q这个典型程序在 IBM JDK 1.1.8 JVM 中运行时占用的系l内存越来越多。似乎直Cؓ(f)它分配非常多的物理内存(sh)后它才开始向pȝq回内存。这些情冉|内存漏洞的征兆吗Q?br />
要理解其中的~由Q我们必ȝ(zhn)?JVM 如何系l内存用作它的堆。当q行 java.exe Ӟ(zhn)用一定的选项来控制垃圾收集堆的v始大和最大大(分别?-ms ?-mx 表示Q。Sun JDK 1.1.8 的默认v始设|ؓ(f) 1 MBQ默认最大设|ؓ(f) 16 MB。IBM JDK 1.1.8 的默认最大设|ؓ(f)pȝȝ理内存大的一半。这些内存设|对 JVM 在用内存时所执行的操作有直接影响。JVM 可能l箋(hu)增大堆,而不{待一个垃圾收集周期的完成?br />
q样Qؓ(f)?jin)查扑ƈ最l消除内存漏z,我们需要用比d监视实用E序更好的工兗当(zhn)试图调试内存漏z时Q内存调试程序(请参阅参考资源)(j)可能z־上用场。这些程序通常?x)显C堆中的对象数、每个对象的实例数和q些对象所占用的内存等信息。此外,它们也可能提供有用的视图Q这些视囑֏以显C每个对象的引用和引用者,以便(zhn)跟t内存漏z的来源?br />
下面我将说明我是如何?Sitraka Software ?JProbedebugger (g)和去除内存漏洞的,以(zhn)对q些工具的部|方式以?qing)成功去除漏z所需的过E有所?jin)解?br />
内存漏洞的一个示?br />
本例集中讨论一个问题,我们部门当时正在开发一个商业发行版软gQ这是一?Java JDK 1.1.8 应用E序Q一个测试h员花?jin)几个小时研I这个程序才最lɘq个问题昄出来。这?Java 应用E序的基本代码和包是由几个不同的开发小l在不同的时间开发的。我猜想Q该应用E序中意外出现的内存漏洞是由那些没有真正理解别h开发的代码的程序员造成的?br />
我们正在讨论?Java 代码{应用户?Palm 个h数字助理创徏应用E序Q而不必编写Q?Palm OS 本地代码。通过使用囑Ş用户界面Q用户可以创建窗体,向窗体中d控gQ然后连接这些控件的事g来创?Palm 应用E序。测试h员发玎ͼ随着不断创徏和删除窗体和控gQ这?Java 应用E序最l会(x)耗尽内存。开发h员没有检到q个问题Q因Z们的机器有更多的物理内存?br />
Z(jin)研究q个问题Q我?JProbe 来确定什么地方出?jin)差错。尽用?JProbe 所提供的强大工具和内存快照Q研I仍然是一个冗长乏呟뀁不断重复的q程Q首先要定出现内存漏洞的原因,然后修改代码Q最后还得检验结果?br />
JProbe 提供几个选项Q用来控制调试期间实际记录哪些信息。经q几ơ试验以后,我断定获取所需信息的最有效Ҏ(gu)是,关闭性能数据攉Q而将注重力集中在所捕捉的堆数据上。JProbe 提供?jin)一个称?Runtime Heap Summary 的视图,它显C?Java 应用E序q行时所占用的堆内存量随旉的变化。它q提供了(jin)一个工h按钮Q必要时可以强制 JVM 执行垃圾攉。假如?zhn)试图弄清楚,?Java 应用E序不再需要给定的cd例时Q这个实例会(x)不会(x)被作为垃圾收集,q个功能很有用。图 2 昄?jin)用中的堆存储量随旉的变化?br />
?2. Runtime Heap Summary
?Heap Usage Chart 中,蓝色部分表明已分配的堆空间大。在启动q个 Java E序q达到稳定状态以后,我强制垃圾收集器q行Q在图中的表现就是绿U(q条U表明插入了(jin)一个检查点Q左侧的蓝线的骤降。随后,我添加了(jin)四个H体Q然后又它们删除,q再ơ调用了(jin)垃圾攉器。当E序q回仅有一个可视窗体的初始状态时Q检查点之后的蓝色区域高?sh)检查点之前的蓝色区域这一情况表明可能存在内存漏洞。我通过查看 Instance Summary 证实实有一个漏z,因ؓ(f) Instance Summary 表明 FormFrame c(它是H体的主用户界面c)(j)的计数在(g)查点之后增加?4?br />
查找原因
Z(jin)测试h员报告的问题剔出Q我采取的第一个步骤是扑և几个单的、可重复的测试案例。就本例而言Q我发现只须d一个窗体,它删除Q然后强制执行垃圾收集,l果׃(x)D与被删除H体相关联的许多cd例仍然处于活动状态。这个问题在 JProbe ?Instance Summary 视图中很明显Q这个视囄计每?Java cd堆中的实例数?br />
Z(jin)查明使垃圾收集器无法正常完成其工作的那些引用Q我使用 JProbe ?Reference GraphQ如?3 所C)(j)来确定哪些类仍然引用着目前未被删除?FormFrame cR在调试q个问题时该q程是最复杂的过E之一Q因为我发现许多不同的对象仍然引用着q个无用的对象。用来查明究竟是哪个引用者真正造成q个问题的试错过E相当耗时?br />
在本例中Q一个根c(左上角用U色标明的那个类Q是问题的发源地。右侧用蓝色H出昄的类处在从最初的 FormFrame c跟t而来的\径上?br />
?3. 在引
资料引用:http://www.knowsky.com/365325.html