Tag: 内存管理

当JVM在运行时耗尽内存以进行分配时会发生什么?

在思考了一个通用的方法来提出这个问题(并且没有找到一个)后,我只想问它作为一个具体的例子: 假设我有一台具有1 Gb内存的Linux机器,它可以分配给进程(物理和交换总数为1 Gb)。 我在计算机上安装了标准的Oracle Hotspot JVM版本7。 如果在给定时刻,有足够的程序运行,只有400 Mb的1 Gb是空闲的,我在那一刻用以下JVM标志启动Java程序: java -Xms256m -Xmx512m -jar myJar.jar 发生了什么? : A. JVM是否无法立即启动,因为它会尝试分配所有512 Mb内存并失败(由于目前没有足够的可用内存)? 如果JVM启动: 如果在某些时候,正在运行的Java进程需要超过400 Mb的内存(并且除了当前的Java进程已经使用的内存之外,仍然只有400 Mb的内存空闲),会发生什么: B. Java进程是否会因OutOfMemroyError而失败? C.它会因一些其他(标准)错误而失败吗? D.是不确定的行为?

Java -Xmx,系统上的最大内存

我的Java应用程序通过运行“java -jar j.jar”进程运行另一个Java应用程序。 众所周知,J.jar根据给定的数据集使用大量内存,并且经常会获得OutOfMemoryError堆。 所以我想在它上面使用-Xmx,这样我就可以分配尽可能多的内存(或接近)。 我想在系统上获取总内存,然后在-Xmx中指定80-90%。 我的问题有什么解决方案吗? 而且,我的解决方案听起来如何? 编辑:我不能减少内存消耗,因为正在使用的内存是Java的内置pack200压缩,我用它来打包一些JAR文件。

Hashtable使用了多少内存?

在Java中,如果我创建一个Hashtable并在其中放入N个元素,它会占用多少内存? 如果它依赖于实现,那么什么是好的“猜测”?

方法区域和PermGen

我试图理解HotSpot JVM的内存结构,并且混淆了两个术语’Method Area’和’PermGen’空间。 我提到的文档说,Method Area包含类和方法的定义,包括字节代码。 其他一些文档说它们存储在PermGen空间中。 那么我可以断定这两个存储区是一样的吗?

强制释放本机内存的示例直接ByteBuffer使用sun.misc.Unsafe分配?

JDK提供了分配所谓的直接ByteBuffers的能力,其中内存在Java堆之外分配。 这可能是有益的,因为垃圾收集器不会触及这个内存,因此不会导致GC开销:这对于像缓存这样的长期存在的东西来说非常有用。 但是,现有实现存在一个关键问题:当拥有ByteBuffer被垃圾收集时,底层内存只是异步分配; 没有办法强迫早期解除分配。 这可能会有问题,因为GC循环本身不受ByteBuffers处理的影响,并且假设ByteBuffers可能驻留在Old Generation内存区域,则可能在ByteBuffer不再使用后几小时调用GC。 但理论上应该可以直接使用sun.misc.Unsafe方法(freeMemory,allocateMemory):这是JDK本身用于分配/解除分配本机内存的方法。 看看代码,我看到的一个潜在问题是内存双重释放的可能性 – 所以我想确保正确清理状态。 任何人都可以指向我这样做的代码吗? 理想情况下,想要使用它而不是JNA。 注意:我看到这个问题有点相关。 看起来指出的答案是很好的方法: 这里是使用这个想法的Elastic Search的代码示例。 谢谢大家!

了解Java内存管理

Java程序员知道JVM运行垃圾收集器,而System.gc()只是建议JVM运行垃圾收集器。 如果我们使用System.gc(),它不一定会立即运行GC。 如果我误解了Java的垃圾收集器,请纠正我。 除了依赖Java的垃圾收集器之外,是否有其他方式进行内存管理? 如果您打算通过某种有助于管理内存的编程实践来回答这个问题,请这样做。

Java VM – 释放的内存是否返回操作系统?

在Java运行时,如果我的应用程序释放内存,运行时是否会将内存释放回操作系统? 或者回到我的流程?

在一长串文件中查找最近修改的3个文件

我有一个文件列表,我想排序和提取前3个最后修改。 约束:由于下游应用程序的兼容性问题,我无法使用Java 7 我目前的选择 解决方案1 File[] files = directory.listFiles(); Arrays.sort(files, new Comparator(){ public int compare(File f1, File f2) { return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified()); } }); 解决方案2 public static void sortFilesDesc(File[] files) { Arrays.sort(files, new Comparator() { public int compare(Object o1, Object o2) { if ((File)o1).lastModified().compareTo((File)o2).lastModified()) { return -1; } else if (((File) o1).lastModified() < ((File) o2).lastModified()) { […]

Enum#values()是否在每次调用时分配内存?

我需要将一个序数int值转换为Java中的枚举值。 这很简单: MyEnumType value = MyEnumType.values()[ordinal]; values()方法是隐式的,我无法找到它的源代码,因此问题。 MyEnumType.values()是否分配了一个新数组? 如果确实如此,我应该在第一次调用时缓存数组吗? 假设转换将经常被调用。

使用Invocation API进行JNI内存管理

当我使用JNI方法构建java对象时,为了将其作为参数传递给我正在使用JNI调用API调用的java方法,我该如何管理它的内存? 这是我正在使用的: 我有一个C对象,它有一个析构函数方法,它比free()更复杂。 这个C对象与Java对象相关联,一旦应用程序完成Java对象,我就不再需要C对象了。 我正在创建这样的Java对象(为了清楚起见,错误检查已被省略): c_object = c_object_create (); class = (*env)->FindClass (env, “my.class.name”); constructor = (*env)->GetMethodID (env, class, “”, “(J)V”); instance = (*env)->NewObject (env, class, constructor, (jlong) c_object); method = (*env)->GetMethodID (env, other_class, “doSomeWork”, “(Lmy.class.name)V”); (*env)->CallVoidMethod (env, other_class, method, instance); 所以,既然我已经完成了instance ,我该怎么办呢? 理想情况下,我想将垃圾收集器留给VM; 当它用instance完成时,如果它还在我提供给它的指针上调用了c_object_destroy() ,那将会很棒。 这可能吗? 一个单独但相关的问题与我在这样的方法中创建的Java实体的范围有关; 我必须手动释放上面的class , constructor或method吗? JNI文档在适当的内存管理方面令人沮丧(在我看来)。