Tag: 内存管理

在Java中为JOGL释放直接缓冲区本机内存

我使用直接缓冲区(java.nio)来存储JOGL的顶点信息。 这些缓冲区很大,在应用程序生命周期内会被多次更换。 内存没有及时解除分配,几次更换后我的内存不足。 似乎没有好的方法来使用java.nio的缓冲类来解除分配。 我的问题是: JOGL中有一些删除Direct Buffers的方法吗? 我正在研究glDeleteBuffer(),但看起来这只是从显卡内存中删除缓冲区。 谢谢

JVM向OS发回内存

我有一个关于JVM内存管理的问题(至少对于SUN的内存管理问题)。 我想知道如何控制JVM将未使用的内存发送回OS(在我的情况下为Windows)这一事实。 我写了一个简单的java程序来说明我的期望。 使用-Dcom.sun.management.jmxremote选项运行它,以便您也可以使用jconsole监视堆。 使用以下程序: package fr.brouillard.jvm; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.List; public class MemoryFree { private BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); private List usedMemory = new LinkedList(); private int totalMB = 0; private int gcTimes = 0; public void allocate(int howManyMB) { usedMemory.add(new byte[howManyMB * 1024 * 1024]); […]

Java内存解释(SUN JVM)

我试图找到sun java vm的内存段的解释,这也是管理员可以理解的 。 它应该解释堆/非堆内存是什么以及不同内存池的重要性。 如果它以某种方式与jconsole视图相关,那将是一个奖励。 有网站有这样的解释吗?

直接分配给Old Generation的巨大对象的大小

最近我一直在阅读Java中不同代的对象分配。 大多数时候,新对象在Eden(Young Generation的一部分)中分配,然后如果满足以下任何条件,它们将被提升为Old Generation。 (1)对象的年龄达到了终点 (2)当从伊甸园(或)另一个幸存者空间(从)复制对象时,幸存者空间(to)已满 但也有一个特殊情况,即对象直接分配给老一代,而不是从年轻一代晋升。 当我们尝试创建的对象很大(可能是几MB的数量级)时会发生这种情况。 有没有办法知道巨大/巨大物体的大小/限制? 我知道G1垃圾收集器的巨大对象标准。 我只是想知道Java 6之前或之中的大小限制。 谢谢你的时间 :)

在释放对象和垃圾回收后,Java仍然使用系统内存

我正在运行JVM 1.5.0(Mac OS X Default),我在Activity Monitor中监视我的Java程序。 我有以下内容: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Date; public class MemoryTest { public static void memoryUsage() { System.out.println( Runtime.getRuntime().totalMemory() – Runtime.getRuntime().freeMemory() ); } public static void main( String[] args ) throws IOException { /* create a list */ ArrayList list = new ArrayList(); /* fill it […]

两个具有相同内容的字符串是否会存储在同一个内存位置?

这是我在采访中遇到的一个问题。 我把两个字符串定义为 String s1=”Java”; String s2=”Java”; 我的问题是这两个引用是否指向相同的内存位置。 通常,当我们创建相同的字符串(没有new关键字)时,内容是否只存储在内存中一次,所有具有相同内容的String对象只是引用相同的位置,而不是冗余地存储字符串“Java”? s1和s2的哈希码是相同的。 但是哈希码是否直接依赖于对象的内存位置?

GC是否将内存释放回操作系统?

当垃圾收集器运行并释放内存时,此内存会返回到操作系统,或者它是否作为进程的一部分保留。 我的印象是,内存从未实际发布回操作系统,而是作为内存区/池的一部分保留,以便由同一进程重用。 结果,进程的实际内存永远不会减少。 一篇提醒我的文章是这个,Java的Runtime是用C / C ++编写的,所以我想同样的事情也适用? 更新 我的问题是关于Java。 我提到C / C ++,因为我假设Java的分配/释放是由JRE使用某种forms的malloc / delete完成的