java编写抢占内存代码,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;ih;i++)

{

StringBuffer sb=new StringBuffer();

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

{

sb.append('*');

}

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

}

}

}

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

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

{

sb.append('*');

}

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

public class Know {

public static void main(String[] args) {

while(true){

System.out.println("ok");

}

}

}

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

希望可以帮到你

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

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

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

自己改一下下面的代码,把堆栈中的元素改成mp3类型的或更大点的东西

4.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;

elements = new Object[2 * elements.length+1];

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

}

}

}

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

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

例子1

Java代码

public class Bad{

public static Stack s=Stack();

static{

s.push(new Object());

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

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

}

}

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

例子2

Java代码

public class NotTooBad{

public void doSomething(){

Stack s=new Stack();

s.push(new Object());

//other code

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

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

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

//交给GC而已,因为它是封闭的,对外不开放,可以说上面的代码99.9999%的

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

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

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

}

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

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

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

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

网站栏目:java编写抢占内存代码,java占内存吗
本文地址:https://www.cdcxhl.com/article22/hsihcc.html

成都网站建设公司_创新互联,为您提供用户体验微信公众号搜索引擎优化小程序开发做网站电子商务

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都app开发公司