请教:为什么这么一小段java小程序源代码代码会使用那么多内存

被阻断的主机:
提示:经我司系统检测该网站上存在有害信息,且在我司发出通知以后24小时还未处理,所以现在主机已经被系统自动禁止访问,
若您是网站,可以查看更多细节,
也可以登录我司【管理中心-其它项目-非法信息监测】处点击【解除锁定】自主恢复此主机的网站访问,并根据【详情】所列线索清除相关有害信息。
特别提醒:根据相关法律法规,网站主办者有义务和责任加强网站管理,杜绝有害信息通过互联网传播,
希望您能加强网站管理,清除有害信息,同时采取必要措施杜绝有害信息再次出现,对多次出现有害信息的网站,有可能会被永久关闭。如何用Java编写一段代码引发内存泄露_百度知道
如何用Java编写一段代码引发内存泄露
我有更好的答案
内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。 &所以我们应该明确:存在内存溢出的因不一定导致内存溢出的果public class Know {&&&& public static void main(String [] args)&&&& {&&&&&&&&
int w = new Integer(args[0]).intValue();&&&&&&&&
int h = Integer.parseInt(args[1]);&&&&&&&&&&&&&&&&&
for(int i=0;i&h;i++)&&&&&&&&
{&&&&&&&&&&&&
StringBuffer sb=new StringBuffer();&&&&&&&&&&&&
for(int j=0;i&w;j++)&&&&&&&&&&&&
{&&&&&&&& &&&&
sb.append('*');&&&&&&&&&&&&
}&&&&&&&&&&&&
System.out.println(sb.toString());
& & &}}这是我在网上找的一个例子,试验了一下,是对的,造成内存溢出的原因是for(int j=0;i&w;j++){ & &sb.append('*');}是死循环,我原先是这么写的一个例子public class Know {&&&& public static void main(String[] args) {&&&&&&&&
while(true){&&&&&&&&
System.out.println(&ok&);&&&&&&&&
}&&&& }}但并没有导致内存溢出,应该是它消耗的内存比较小或者运行时间短,正如这句话所说“存在内存溢出的因不一定导致内存溢出的果”希望可以帮到你
初级软件工程师
List&Integer& l = new ArrayList&Integer&();
for (int j = 0; j & Integer.MAX_VALUE; j++)
l.add(new Integer(j));
}运行一分钟左右就会抛出该异常
new 了不 delete
public static void main(String[] args) {
String a = new String(&lol&);
while(true){
其他2条回答
为您推荐:
其他类似问题
您可能关注的内容
内存泄露的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。健身 软件开发 讲师 作者
如何看一段JAVA代码耗了多少内存
简单的方法,如下:
Runtime r = Runtime.getRuntime();
long startMem = r.freememory(); // 开始时的剩余内存
你的代码……
long orz = startMem - r.freememory(); // 剩余内存 现在
但这当然不够精确,尤其是“你的代码”足够多的时候。
那要怎么样做才能够精确呢?使用,java.lang.instrument ,当然,
首先,我们得会用这个instrument类,参考文章:
其次,已经有强人为我们写好了计算单个对象占用内存大小的api,地址:
剩下的,思路就是:
在启动Java进程的时候把上文中写好的这个agent作为参数放进去,然后getObjectSize()方法可获取单个对象的大小,我们自己再通过反射逐个成员,对其进行getObjectSize(),然后所有的size求和。
最后,还要知道的一点知识是:
一个实例化的对象在内存中需要存储的信息包括:
对象的头部(对象的GC信息,hash值,类定义引用等)
对象的成员变量: 包括基本数据类型和引用。 如成员变量是一个引用, 引用了其他对象,被引用的对象内存另外计算。
对象大小分为:
自身的大小(Shadow heap size)
所引用的对象的大小(Retained heap size)。
基本数据类型大小如下:
size(bits)
在32位的JVM上,一个对象引用占用4个字节;在64位上,占用8个字节。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!博客分类:
转自:http://dbaplus.cn/news-21-130-1.html
1. 应用程序占用资源高问题
目前大部分应用程序采用的是JAVA语言开发,在产品上线使用一段时间后,经常会出现某个JAVA程序占用的CPU,内存过高,而且几乎从不释放,导致系统卡顿,用户使用变慢,如果要恢复,则必须杀掉该进程或重启该服务,然后进行此操作时,必定会导致业务中断。
程序主要由代码组成,优化则需要知道是哪段代码占用资源,并且一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环,所以通过优化代码来降低应用程序的资源消耗或者在应用的使用过程中减少死循环则必不可少。
下面我们以4A平台的字符网关服务器为例来进行相应分析。
2. 问题分析
2.1. CPU过高分析
1)使用TOP命令查看CPU、内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比。其中CPU状态中标示id的为空闲CPU百分比。当空闲CPU百分比越低,说明CPU占用率越高。
2)初步分析可以发现其中主要占用CPU的进程为java子进程jerrySsh服务(用户访问资源使用的监听服务),在用户量不大的情况下,CPU消耗资源很大。根据研发反馈字符网关设定的最大访问量可达到500/台,目前字符网关的资源使用现状无法满足设定的要求。
● 分析手段
目前针对Linux下java进程占用CPU高的分析手段主要为使用linux命令查出高CPU使用的进程,前分析其是由于进程原因还是系统原因,在分析出为进程消耗过高CPU后列出占用CPU高和占用时间最长的线程并使用jdk自带的jstack工具进行分析CPU使用分析:
export JAVA_HOME=/usr/apps/java/jdk1.6.0_20/
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
分析过程:
根据top命令,发现PID为13033的Java进程占用CPU %id 50%以上,占用CPU过高
找到该进程后,首先显示线程列表,并按照CPU占用高的线程排序:
[root@YZ-A-ZFWG-4 ~]# ps -mp 13033 -o THREAD,tid,time | sort –rn
显示结果如下:
找到了耗时最高的线程28358,占用CPU时间达8分多钟。将需要的线程ID转换为16进制格式:
[root@YZ-A-ZFWG-4 ~]# printf "%x\n" 28358
最后打印线程的堆栈信息:
经比对发现占用CPU高的jerrySsh服务中高消耗CPU的代码均为一些等待和读取的语句。内核时间占用最长的线程所使用的代码抓取:
2.2. 内存使用分析
目前字符网关内存使用趋于平衡,除偶尔出现close_wait连接后由于未能得到及时释放而占用了大量内存导致buffers/cache较小外,其他线条暂未出现问题,据研发反馈已经做过优化,但是从目前观察来看coles_wait连接释放时间稍长。并且由于buffers、cached释放不出来,导致系统剩余物理内存较小,可能会影响系统性能,为了彻底解决此类问题,所以我们做了以下分析:
在linux的内存分配机制中,系统优先使用物理内存,当物理内存还有空闲,表示还够用时,不会释放其占用内存,即使占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快,因此查看目前进程正在实际被使用的内存(used-buffers-cache),也可以认为如果交换分区(swap)没有大量使用,物理内存(mem)还是够用的,只有物理内存(mem)被当前进程实际占用完(没有了buffers和cache),才会使用到交换分区(swap)。
但是从代码的角度,目前研发人员主要关注java.lang.OutOfMemoryError: Java heap space异常,减少不必要的对象创建,同时避免内存泄漏,所以分析代码才是我们接下来要做的主要工作;以下为字符网关分析内存占用的故障排查过程:
● 分析手段
top命令:Linux命令。可以查看实时的内存使用情况。
jmap -histo:live [pid],然后分析具体的对象数目和占用内存大小,从而定位代码。
jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用MAT工具分析是否存在内存泄漏。
Java提供了一个很好的内存监控工具:jmap命令
jmap命令有下面几种常用的用法:
从上述打印的日志可以得知该进程调系统进程占用内存的主要程序。
使用./jmap -histo:live 14978查询当前 Java进程创建的活跃对象数目和占用内存大小。
可以日志中发现constMethodKlass、methodKlass、symbolKlass都占用了大量的内存,特别是占用了大量内存的int数组,需要仔细检查相关代码,接下来这些事就可以丢给研发了。
3. 总结分析手段
● 分析CPU占用的方法和手段:
top命令:可以查看实时的CPU使用情况。
ps -ef命令:可以查看进程以及进程中线程的当前CPU使用情况以及属于当前状态的采样数据。
jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。
pstack:Linux命令。可以查看某个进程的当前线程栈运行情况
● 分析内存性能的方法和技巧:
top命令:可以查看实时的内存使用情况。
jmap -histo:live [pid],然后分析具体的对象数目和占用内存大小,从而定位代码。
jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用MAT工具分析是否存在内存泄漏等等。
浏览: 155959 次
二咻_win 写道TPS和响应时间的平均值怎么看呢?虚线就是平 ...
推荐一个开源的分析工具:开源工具pyNmonAnalyzer介 ...
无意间看到你的项目,很赞,利用一个周末的时间在你的基础上做了一 ...
TPS和响应时间的平均值怎么看呢?
jmetertool.tar.gz你写的这个在哪里下载?链接没 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'被阻断的主机:
提示:经我司系统检测该网站上存在有害信息,且在我司发出通知以后24小时还未处理,所以现在主机已经被系统自动禁止访问,
若您是网站,可以查看更多细节,
也可以登录我司【管理中心-其它项目-非法信息监测】处点击【解除锁定】自主恢复此主机的网站访问,并根据【详情】所列线索清除相关有害信息。
特别提醒:根据相关法律法规,网站主办者有义务和责任加强网站管理,杜绝有害信息通过互联网传播,
希望您能加强网站管理,清除有害信息,同时采取必要措施杜绝有害信息再次出现,对多次出现有害信息的网站,有可能会被永久关闭。}

我要回帖

更多关于 java小游戏代码大全 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信