重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

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占内存吗
浏览路径:http://cqcxhl.com/article/hsihcc.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP