可能重复:
在C#中,当您创建一个新的数组(它是一个引用类型)时,它会将一个指针放在堆中的堆栈和对象本身上。如果使用简单的原语类型(如int、double等)创建这个数组,那么它所做的就是将值准确地放置在堆中,而不是将指针指向存储其内容的另一个堆地址。
那么,请有人解释一下在Java中是如何发生的吗?Java总是在数组中使用Integer (一个引用类型),还是像C#一样对待值类型?
int[] hello = new int[5];
hello[0] = 2; // C# put this value directly in same slot and doesn't
//c
我们在Solaris 10上运行了一个java进程,为200-300个并发用户提供服务。管理员报告说,随着时间的推移,进程使用的内存显著增加。它在几天内达到2GB,并且从未停止生长。
我们已经抛出了堆,并使用Eclipse内存分析器对其进行了分析,但是没有看到任何异常的东西。堆的大小很小。
在添加内存stat日志之后,我们在我们的应用程序中发现了管理员使用的"top“实用程序报告的内存使用情况与MemoryMXBean和运行时库报告的使用情况之间的差异。
这是两个方面的输出。
Memory usage information
From the Runtime library
Fre
您将从以下接口实现堆:
public interface Heap<V extends Comparable<V>> {
public void add(V value);
public V[] toArray(V[] array);
public V remove();
public void fromArray(V[] array);
public V[] getSortedContents(V[] array);
}
但是,堆应该实现为节点堆,也就是说,内部实现应该是树而不是数组。getSortedContents方法应该在内部将堆转换为其数
我们需要发送非常大的SOAP消息(multiparts,MTOM),比如大约1或2 or。有时,该过程会以以下OOM结束:
java.lang.OutOfMemoryError: Java Heap Space
at java.util.Arrays.copyOf(Arrays.java:2479)
at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:203)
at com.ibm.ws.webservices.engine.transport.channel.OutboundOutputStream.