我使用Jackson映射器将我的java对象转换为String,但这些对象不会被堆中的GC删除.
我的代码
List<Object[]> reportList; // This contains my objects
ObjectMapper map = new ObjectMapper(); // org.codehaus.jackson.map.ObjectMapper
return map.writeValueAsString(reportList);
Run Code Online (Sandbox Code Playgroud)
这会将String返回到我的视图层,但是通过保留在堆中的对象映射器解析对象.我已经采取了堆转储.
Class Name | Objects | Shallow Heap | Retained Heap
------------------------------------------------------------------
char[] | 5,03,267 | 5,48,74,336 | >= 54,874,336
byte[] | 18,067 | 3,09,01,016 | >= 30,901,016
java.lang.reflect.Method| 2,60,262 | 2,08,20,960 | >= 32,789,040
java.util.HashMap$Entry | 4,31,423 | 1,38,05,536 | >= 92,963,752
java.lang.String | 4,97,172 | 1,19,32,128 | >= 60,889,416
------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
看到char
Class Name | Shallow Heap | Retained Heap
----------------------------------------------------------------------------------------------------- …Run Code Online (Sandbox Code Playgroud) 我改进了代码,以便从垃圾收集器获得更好的结果。
现在,当我调用它时,System.gc()它会释放所有内存。但是,当我在不调用应用程序的情况下观察内存使用情况时,System.gc()确实会保留并使用越来越多的内存。
这是否意味着我的改进正在发挥作用,并且我的所有参考资料都是正确的,并且我可以忽略 JVM 如何自行释放内存。或者我的代码中是否存在其他问题,这就是 JVM 在不运行垃圾收集器的情况下保留更多内存的原因。
我有一个想要调用system.gc()的java应用程序.释放记忆是一种合理的方法吗?或任何其他建议?万分感激!
我有一个java服务器任务,它占用内存.我怀疑它曾经超过MinHeapFreeRatio,但那是猜测.更有趣的是,GC将成熟生成减少到大约2%,但从不减少堆的分配内存.
Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 3221225472 (3072.0MB) NewSize = 268435456 (256.0MB) MaxNewSize = 268435456 (256.0MB) OldSize = 805306368 (768.0MB) NewRatio = 7 SurvivorRatio = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 176160768 (168.0MB) Heap Usage: New Generation (Eden + 1 Survivor Space): capacity = 241631232 (230.4375MB) used = 71657320 (68.3377456665039MB) free = 169973912 (162.0997543334961MB) 29.65565312351675% used Eden Space: capacity = 214827008 (204.875MB) used = 47322984 (45.130714416503906MB) free = 167504024 (159.7442855834961MB) 22.028414602320392% used From Space: …
我的应用程序遇到一些内存不足问题,想调用垃圾收集器,但我不确定应该用哪种方法调用它。
这是我的代码:
public static void CleanUpMemory(){
System.runFinalization();
Runtime.getRuntime().gc();
System.gc();
}
Run Code Online (Sandbox Code Playgroud)
目前我正在调用这个方法,onStop()但在内部调用它更好onDestroy()吗?
就我而言,我有两个名为 A(主要活动)和 B(子活动)的活动。A 将启动 B(B 使用 Glide 图像库加载一些图像)。
如果我使用 android 内存监视器获得内存分配,我可以清楚地看到内存分配增长。这完全没问题,因为我们在活动 B.Image Attached 中做了一些与图像相关的事情。
所以我的问题是,如果我在活动 B 中按下后退按钮,它将进入活动 A 并且分配的内存不会被清除。内存分配仍将是相同的数量。
这是正常的安卓行为吗?
如果不是,我如何手动清理内存?
我手动运行GC如下,但同样的结果没有运气:(。
在活动 B
@Override
protected void onDestroy() {
super.onDestroy();
System.gc();
}
Run Code Online (Sandbox Code Playgroud) 我在 Linux 上使用 OpenJDK 11,我需要确保使用 HttpURLConnection 完成的所有 Web 请求都已正确关闭,并且不打开任何文件描述符。
甲骨文手册讲述使用close上InputStream和Android的手册告诉编译器使用disconnect的上HttpURLConnection对象。
我还设置Connection: close和http.keepAlive以false避免连接池。
这似乎适用于普通的http请求,但不适用于其响应以非分块编码发送的加密https请求。似乎只有 GC 会清理关闭的连接。
此示例代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;
public class Test {
private static int printFds() throws IOException {
int cnt = 0;
try (Stream<Path> paths = Files.list(new File("/proc/self/fd").toPath())) {
for …Run Code Online (Sandbox Code Playgroud) 我想测试Java WeakHashMap类功能,为此我编写了以下测试:
public class WeakHashMapTest {
public static void main(String args[]) {
Map<String, Object> weakMap = new WeakHashMap<>();
String x = new String("x");
String x1 = new String("x1");
String x2 = new String("x2");
weakMap.put(x, x);
weakMap.put(x1, x1);
weakMap.put(x2, x2);
System.out.println("Map size :" + weakMap.size());
// force all keys be eligible
x=x1=x2=null;
// call garbage collector
System.gc();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Map size :" + weakMap.size());
System.out.println("Map :" + weakMap);
}
}
Run Code Online (Sandbox Code Playgroud)
运行WeakMapTest类后,我得到以下输出令人不快惊讶:
gc前的地图:{x = …
我有一个在大型数据集上运行的复杂Java应用程序.该应用程序执行速度相当快,但随着时间的推移,它似乎占用了大量内存并减速.有没有办法在不重新启动应用程序的情况下运行JVM垃圾收集器?