我正在开发一个Java应用程序,其架构类似于Java-EE组件作为一端而C++组件作为另一端.
当我连续执行应用程序时,我进入java.lang.OutOfMemoryErrorJava堆.我被告知这与Java内存泄漏不同.如果是这样OutOfMemoryError和Java内存泄漏有什么区别?我如何使用Java Profiler进行分析?
Java中的内存泄漏是指您不使用的对象无法进行垃圾回收,因为您仍然在某处对它们进行了引用.
OutOfMemoryError当没有剩余内存来分配新对象时抛出An .这通常是由内存泄漏引起的,但如果您只是想一次在内存中保留太多数据,也会发生这种情况.
JDK包含有用的工具,如jhat和visualVM,允许您检查内存中的对象以及它们之间的引用.使用这些,您经常可以找到导致问题的对象.
这是一个特别愚蠢的内存泄漏.从不使用旧对象,但不能进行垃圾回收.虽然看起来很荒谬,但您可以轻松地在大型项目中错误地创建等效泄漏.
public class Leaky
{
private static List<Object> neverRead = new ArrayList<Object>();
public static void main(String[] args)
{
while(true)
{
neverRead.add(new Object());
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个不是内存泄漏,但通常会导致某个OutOfMemoryError地方.
public class Allocaty
{
public static void main(String[] args)
{
long[] array = new long[Integer.MAX_VALUE];
long value = 1L;
for(int ii=Integer.MAX_VALUE; ii>=0; ii--)
{
array[ii] = value++;
}
String str = Arrays.toString(array);
System.out.printf("%d: %s", array.length, str);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2224 次 |
| 最近记录: |