相关疑难解决方法(0)

使用jackson ObjectMapper时保留的堆大小更多

我使用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)

java garbage-collection heap-memory jackson

6
推荐指数
1
解决办法
3340
查看次数

强制 JVM 释放内存

我改进了代码,以便从垃圾收集器获得更好的结果。

现在,当我调用它时,System.gc()它会释放所有内存。但是,当我在不调用应用程序的情况下观察内存使用情况时,System.gc()确实会保留并使用越来越多的内存。

这是否意味着我的改进正在发挥作用,并且我的所有参考资料都是正确的,并且我可以忽略 JVM 如何自行释放内存。或者我的代码中是否存在其他问题,这就是 JVM 在不运行垃圾收集器的情况下保留更多内存的原因。

java memory garbage-collection jvm

6
推荐指数
2
解决办法
9929
查看次数

调用`System.gc()`是一种在Java应用程序中管理内存的好方法吗?

我有一个想要调用system.gc()的java应用程序.释放记忆是一种合理的方法吗?或任何其他建议?万分感激!

java garbage-collection

5
推荐指数
2
解决办法
1152
查看次数

Android Back按钮调用ondestroy?

当按下后退按钮并且正在激活当前的活动时,是否会调用ondestroy?似乎不是在呼唤我

android

5
推荐指数
1
解决办法
8765
查看次数

当使用率低于MaxHeapFreeRatio时,为什么分配的堆内存不会缩小?

我有一个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: …

java heap-memory

5
推荐指数
1
解决办法
5583
查看次数

Android:用哪种方法调用垃圾收集器更好?

我的应用程序遇到一些内存不足问题,想调用垃圾收集器,但我不确定应该用哪种方法调用它。

这是我的代码:

 public static void CleanUpMemory(){
    System.runFinalization();
    Runtime.getRuntime().gc();
    System.gc();
 }
Run Code Online (Sandbox Code Playgroud)

目前我正在调用这个方法,onStop()但在内部调用它更好onDestroy()吗?

java android

5
推荐指数
1
解决办法
3042
查看次数

为什么android在完成活动后不清理内存?

就我而言,我有两个名为 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)

java android memory-management android-memory android-glide

5
推荐指数
1
解决办法
1577
查看次数

HttpURLConnection 的套接字被泄露

我在 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 connection-leaks httpurlconnection

5
推荐指数
1
解决办法
635
查看次数

Java WeakHashMap类

我想测试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 garbage-collection weak-references weakhashmap

4
推荐指数
1
解决办法
190
查看次数

强制Java虚拟机运行垃圾收集器

我有一个在大型数据集上运行的复杂Java应用程序.该应用程序执行速度相当快,但随着时间的推移,它似乎占用了大量内存并减速.有没有办法在不重新启动应用程序的情况下运行JVM垃圾收集器?

java garbage-collection

3
推荐指数
1
解决办法
2万
查看次数