网站首页 > 文章中心 > 其它

java编写抢占内存代码

作者:小编 更新时间:2023-08-26 23:30:54 浏览量:267人看过

如何用Java编写一段代码引发内存泄露

内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存. ?

所以我们应该明确:存在内存溢出的因不一定导致内存溢出的果

public class Know {

public static void main(String [] args)

{

int w = new Integer(args[0]).intValue();

int h = Integer.parseInt(args[1]);

java编写抢占内存代码-图1

for(int i=0;ih;i++)

StringBuffer sb=new StringBuffer();

for(int j=0;iw;j++)

sb.append('*');

java编写抢占内存代码-图2

}

System.out.println(sb.toString());

?}

这是我在网上找的一个例子,试验了一下,是对的,造成内存溢出的原因是

?sb.append('*');

是死循环,我原先是这么写的一个例子

public static void main(String[] args) {

while(true){

System.out.println("ok");

但并没有导致内存溢出,应该是它消耗的内存比较小或者运行时间短,正如这句话所说"存在内存溢出的因不一定导致内存溢出的果"

希望可以帮到你

用java写的软件为什么在运行时候程序占用内存会越来越大

数据库连接没有关闭,代码不合理,循环过多,创造了太多的对象,java还真不占什么内存

如何编写一个java内存泄露程序?

对于基本类型,大家基本上没有异议,但是对于引用类型我们也不能有异议.

Java内存泄露情况

JVM回收算法 是很复杂的,我也不知道他们怎么实现的,但是我只知道他们要实现的就是:对于没有被引用的对象是可以回收的.所以你要造成内存泄露就要做到:

持有对无用对象的引用!

不要以为这个很轻易做到,既然无用,你怎么还会持有它的引用? 既然你还持有它,它怎么会是无用的呢?

以下以堆栈更经典这个经典的例子来剖析.

Java代码

public class Stack {

private Object[] elements=new Object[10];

private int size = 0;

public void push(Object e){

ensureCapacity();

elements[size++] = e;

public Object pop(){

if( size == 0)

throw new EmptyStackException();

return elements[--size];

private void ensureCapacity(){

if(elements.length == size){

Object[] oldElements = elements;

System.arraycopy(oldElements,0, elements, 0, size);

上面的原理应该很简单,假如堆栈加了10个元素,然后全部弹出来,虽然堆栈是空的,没有我们要的东西,但是这是个对象是无法回收的,这个才符合了内存泄露的两个条件:无用,无法回收.

但是就是存在这样的东西也不一定会导致什么样的后果,假如这个堆栈用的比较少,也就浪费了几个K内存而已,反正我们的内存都上G了,哪里会有什么影响,再说这个东西很快就会被回收的,有什么关系.下面看两个例子.

例子1

public class Bad{

public static Stack s=Stack();

static{

s.push(new Object());

s.pop(); //这里有一个对象发生内存泄露

java编写抢占内存代码-图3

s.push(new Object()); //上面的对象可以被回收了,等于是自愈了

因为是static,就一直存在到程序退出,但是我们也可以看到它有自愈功能 ,就是说假如你的Stack最多有100个对象,那么最多也就只有100个对象无法被回收其实这个应该很轻易理解,Stack内部持有100个引用,最坏的情况就是他们都是无用的,因为我们一旦放新的进取,以前的引用自然消失!

public class NotTooBad{

public void doSomething(){

Stack s=new Stack();

//other code

s.pop();//这里同样导致对象无法回收,内存泄露.

}//退出方法,s自动无效,s可以被回收,Stack内部的引用自然没了,所以

//这里也可以自愈,而且可以说这个方法不存在内存泄露问题,不过是晚一点

//情况是不会造成任何影响的,当然你写这样的代码不会有什么坏的影响,但是

//绝对可以说是垃圾代码!没有矛盾吧,我在里面加一个空的for循环也不会有

//什么太大的影响吧,你会这么做吗?

Java开发如何准确的定位到占用内存或CPU最高的一行代码

要定位到行,代码要debug编译,至少要带上行信息.

线程占用内存高低,可以用jmap做heap dump出来给MomoryAnalysis分析他可以按线程统计,一般也可以用它来找出造成OOM的原因.

线程占用CPU,上述内存的问题是一个方面,另外也可以jstack打线程栈来分析.Linux上ps -T -p可以看底层线程的CPU占用(Windows上需要额外按工具),记得线程编号可以在jstack打出来的线程栈中检查.

以上就是土嘎嘎小编为大家整理的java编写抢占内存代码相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章