class Test{ public Test test = null; public void main(String args[]){ Test t1 = new Test(); Test t2 = new Test(); t1.test=t2; t2.test=t1; t1=null; t2=null; } }
class Test{ public Test test = null; public static void main(String args[]){ Test t1 = new Test(); Test t2 = new Test(); t1.test=t2; t2.test=t1; t1=null; t2=null; } } 丢了个static^-^ 不知道这个属不属于内存泄漏~~
lxleaves(飘泊的叶子) 说: class Test{ public Test test = null; public static void main(String args[]){ Test t1 = new Test(); Test t2 = new Test(); t1.test=t2; t2.test=t1; t1=null; t2=null; } } 丢了个static^-^ 不知道这个属不属于内存泄漏~~这个不会内存泄漏,现代垃圾回收算法可以回收。
#include <iostream> using namespace std;int main(){ int *Test = new int(100); } //out of Memory
导致系统资源耗尽。jvm中垃圾回收机制,开辟的变量(内存)在使用完之后没有释放,jvm会自动回收。一般在jvm中常见的类似状态是
数据库连接不关之类的操作。。
集合类的clear等
class TestMem
{
public static void main(String[] args)
{
System.out.println("Hello World!");
Vector vec=new Vector();
int i = 0;
while(true){
vec.add(new String("hello"));
i ++;
if (i % 10000 == 0)
{
System.out.println(i);
}
} }
}---------- java ----------
Hello World!
10000
20000
30000
40000
50000
60000
70000
80000
90000
100000
110000
120000
130000
140000
150000
160000
170000
180000
190000
200000
210000
220000
230000
240000
250000
260000
270000
280000
290000
300000
310000
320000
330000
340000
350000
360000
370000
380000
390000
400000
410000
420000
430000
440000
450000
460000
470000
480000
490000
500000
510000
520000
530000
540000
550000
560000
570000
580000
590000
600000
610000
620000
630000
640000
650000
660000
670000
680000
690000
700000
710000
720000
730000
740000
750000
760000
770000
780000
790000
800000
810000
820000
830000
840000
850000
860000
870000
880000
890000
900000
910000
920000
930000
940000
950000
960000
970000
980000
990000
1000000
1010000
1020000
1030000
1040000
1050000
1060000
1070000
1080000
1090000
1100000
1110000
1120000
1130000
1140000
1150000
1160000
1170000
1180000
1190000
1200000
1210000
1220000
1230000
1240000
1250000
1260000
1270000
1280000
1290000
1300000
1310000
1320000
1330000
1340000
1350000
1360000
1370000
1380000
1390000
1400000
1410000
1420000
1430000
1440000
1450000
1460000
1470000
1480000
1490000
1500000
1510000
1520000
1530000
1540000
1550000
1560000
1570000
1580000
1590000
1600000
1610000
1620000
1630000
1640000
1650000
1660000
1670000
1680000
1690000
1700000
1710000
1720000
1730000
1740000
1750000
1760000
1770000
1780000
1790000
1800000
1810000
1820000
1830000
1840000
1850000
1860000
1870000
1880000
1890000
1900000
1910000
1920000
1930000
1940000
1950000
1960000
1970000
1980000
1990000
2000000
2010000
2020000
2030000
2040000
2050000
2060000
2070000
2080000
2090000
2100000
2110000
2120000
2130000
2140000
2150000
2160000
2170000
2180000
2190000
2200000
2210000
2220000
2230000
2240000
2250000
2260000
2270000
2280000
2290000
2300000
2310000
2320000
2330000
java.lang.OutOfMemoryError
Exception in thread "main" Normal Termination
Output completed (4 sec consumed).
打开一个1G的文件保存到内存中?
public Test test = null;
public void main(String args[]){
Test t1 = new Test();
Test t2 = new Test();
t1.test=t2;
t2.test=t1;
t1=null;
t2=null;
}
}
public Test test = null;
public static void main(String args[]){
Test t1 = new Test();
Test t2 = new Test();
t1.test=t2;
t2.test=t1;
t1=null;
t2=null;
}
}
丢了个static^-^
不知道这个属不属于内存泄漏~~
也可调用gc()方法和finalize()方法联合控制.
class Test{
public Test test = null;
public static void main(String args[]){
Test t1 = new Test();
Test t2 = new Test();
t1.test=t2;
t2.test=t1;
t1=null;
t2=null;
}
}
丢了个static^-^
不知道这个属不属于内存泄漏~~这个不会内存泄漏,现代垃圾回收算法可以回收。
using namespace std;int main(){
int *Test = new int(100);
} //out of Memory
用一个循环申请Object对象,并将所申请的对象放入一个Vector中,如果仅仅
释放引用本身,那么Vector仍然引用该对象,所以这个对象对GC来说是不可回
收的。因此,如果对象加入到Vector后,还必须从Vector中删除,调用Vector
的remove方法,当然如果这个Vector不再使用了,直接将Vector对象设置为
null,所以对象都会被释放了。
Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
Object o=new Object();
v.add(o);
o=null;
}
//此时,所有的Object对象都没有被释放,因为变量v引用这些对象.对话框在需要释放时没有采用dispose()方法向swing注销,造成资
源的不可回收
/**
* 退出预览窗口
* @param evt
*/
private void exitPrevActionPerformed(java.awt.event.ActionEvent evt){
this.hide();
}所有已经注册的keystrok在释放时没有注销,造成资源的不可回收
okButton.registerKeyboardAction( okButtonListener,
KeyStroke.getKeyStroke( KeyEvent.VK_ENTER, 0, true ),
JComponent.WHEN_IN_FOCUSED_WINDOW ); 仅在初始化时注册了okbutton的KeyboardAction。没有释放。总之,在java中的内存泄露是因为编程上的疏忽,而导致某些对象在长时间没
有被使用的情况下,却还被其它变量或对象引用,而不能被虚拟机回收.
要避免此,一是,当有addXXX方法时,就要有removeXXX方法对应,当有registxxx
时,就要有unregistxxx,反正是在做JDBC,事件注册,JMS消息注册时(涉及到资源
调用时),一定要记得释放资源.
二是,良好的编程风格,和类设计.类之间的耦合程度要尽量低,结构清晰.三,推荐工具.
Borland公司的OptimizeIt,当然还有其他一些常见的工具如JinSight和Purify.
会的,java中严格来说没什么内存泄漏,
像lxleaves(飘泊的叶子) 的例子,这个也对象确实一直在内存里,但是也可能通过
Test.test来取到的,所以不要考虑这个,
除非你一次new很多很多的对象放到一个List等里(这个List生存时间很长)时,
而且用过list(i)之后你没有把list(i)=null
list(i)你以后也不用了,那么就会出outofmemmory
我只是在书上看过,但是没有看到实例!
java中同样并不是绝对的安全的,在一些特殊的情况下,同样存在内存泄漏这个问题!要研究这个问题,那你就得详细的看看,java的回收机制吧!