所以我在远程盒子上看着一个带有jmap的堆,我想强制垃圾收集.如果不突然进入jvisualvm或jconsole和朋友,你怎么做?
我知道你不应该在强制垃圾收集的实践中 - 你应该弄清楚为什么堆很大/正在增长.
我也意识到System.GC()实际上并没有强制进行垃圾收集 - 它只是告诉GC你希望它发生.
话虽如此,有办法轻松做到这一点吗?我失踪了一些命令行应用程序?
列出您最喜欢的堆分析工具(例如jprofiler,jmap,...).让我们为每个答案保留一个工具,并列出每个工具的优缺点.
我一直在尝试jmap -histo和jmap -dump今天
按此顺序运行时
jmap -dump:format=b,file=heap.1 [pid]
jmap -dump:live,format=b,file=heap.2 [pid]
jmap -dump:format=b,file=heap.3 [pid]
Run Code Online (Sandbox Code Playgroud)
heap.3类似于heap.2不止heap.1.特别是,我感兴趣的"死"对象heap.1不存在heap.3.
看到这个,我开始寻找可以告诉我应该期待的文档.我最接近的是这次讨论,来自briand和alanb的评论意味着在实践中我可以预期当我使用live选项时会发生这个GC; 但答案是五年了,论坛上的帖子对于规范来说似乎有些不正式.
我在哪里可以找到记录的当前行为?
UPD 21.11.2017:该错误已在JDK中修复,请参阅Vicente Romero的评论
摘要:
如果for语句用于任何Iterable实现,则集合将保留在堆内存中直到当前作用域(方法,语句体)的结尾,并且即使您没有对集合和应用程序的任何其他引用也不会进行垃圾回收需要分配一个新的内存.
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8175883
https://bugs.openjdk.java.net/browse/JDK-8175883
例子:
如果我有下一个代码,它会分配一个包含随机内容的大字符串列表:
import java.util.ArrayList;
public class IteratorAndGc {
// number of strings and the size of every string
static final int N = 7500;
public static void main(String[] args) {
System.gc();
gcInMethod();
System.gc();
showMemoryUsage("GC after the method body");
ArrayList<String> strings2 = generateLargeStringsArray(N);
showMemoryUsage("Third allocation outside the method is always successful");
}
// main testable method
public static void gcInMethod() {
showMemoryUsage("Before first memory allocating");
ArrayList<String> strings …Run Code Online (Sandbox Code Playgroud) 我有一个24x6计划运行的应用程序.目前,在运行几天后,将自动执行Full GC - 通常在一天的繁忙时段执行,这会对用户响应时间产生负面影响.
我想做的是强制使用全GC - 可能在每晚的午夜,在极低的使用时间内 - 以防止它在白天发生.我已经尝试过System.gc(),但它似乎并不能保证何时会发生Full GC,或者即使它会发生.有没有办法做到这一点?
版本信息:
Java(TM)SE运行时环境(版本1.6.0_11-b03)
Java HotSpot(TM)服务器VM(版本11.0-b16,混合模式)
另外 -
更具体地说,我正在寻找一种技术来确保Full GC将要发生,而不是一个简单的方法/函数来调用它来运行它.
目前,我正在考虑修改CMS使用的百分比阈值,以确定何时需要完整GC.
谢谢你的帮助.
我在本地模式下使用pyspark 1.5在我的4核16GB机器上运行了大约3百万条记录x 15列所有字符串的工作流程.我注意到如果我在没有首先重启spark的情况下再次运行相同的工作流程,则内存耗尽并且我会出现Out of Memory Exceptions.
由于我的所有缓存总计大约1 GB,我认为问题在于垃圾收集.我能够通过调用以下方式手动运行python垃圾收集器:
import gc
collected = gc.collect()
print "Garbage collector: collected %d objects." % collected
Run Code Online (Sandbox Code Playgroud)
这有点帮助.
我根据这篇文章使用了spark的GC设置,并尝试压缩RDD并将序列化器更改为Kyro.这减慢了处理速度,对内存没有多大帮助.
因为我确切知道何时有空闲的cpu周期来调用GC,所以它可以帮助我了解如何在JVM中手动调用它.
我正在使用JNI来调用静态java方法,该方法又创建一个Swing JFrame并显示它.代码非常简单,Java代码独立工作(即java StartAWT做它应该做的事情),而当使用JNI从C调用时,进程挂起.
我在Mac OS X 10.8 Mountain Lion上使用JDK 1.7.0_09.
这是我用来调用静态方法的C代码:
JavaVM* jvm;
JNIEnv* env = create_vm(&jvm);
jclass class = (*env)->FindClass(env, "StartAWT");
jmethodID method = (*env)->GetStaticMethodID(env, class, "run", "()V");
(*env)->CallStaticVoidMethod(env, class, method);
(*jvm)->DestroyJavaVM(jvm);
Run Code Online (Sandbox Code Playgroud)
这个StartAWT类看起来像这样:
public class StartAWT {
public static class Starter implements Runnable {
public void run() {
System.out.println("Runnning on AWT Queue.");
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("That's a frame!");
JLabel label = new JLabel("A Label");
frame.getContentPane().add(label);
frame.pack();
frame.setVisible(true);
}
}
public static class GUI …Run Code Online (Sandbox Code Playgroud) 可能重复:
强制Java中的垃圾收集?
我可以用Java强制垃圾收集吗?
System.gc()只是一个建议.它没用.
当我确定不再使用某些资源时,为什么我不能强行清理它们呢?
就像C++中的delete()和C中的free()一样?
当有很多资源无法重用时,这可能真的很糟糕.我们所能做的就是sleep().
任何解决方案?谢谢
有没有办法java.net.http.HttpClient立即释放它所持有的资源?
在内部,它包含一个选择器,一个连接池和一个Executor(当使用默认值时).但它没有实现Closeable/ AutoCloseable.
假设我有一个Swings Java应用程序,我设置的最小堆是64MB,最大堆是2GB,当用户启动应用程序时,会显示登录界面,此时应用程序使用64MB,权限?从我的Windows 7中,我可以看到java应用程序从操作系统的内存资源监视器中分配了64MB(实际上,它超过64MB,因为JVM需要一些内存来完成它的任务).
之后,用户执行了一些非常繁重的工作,然后应用程序使用2G.然后用户注销应用程序,再次显示登录屏幕(应用程序尚未关闭).此时应用程序使用64MB的实际内存(假设这是完美的内存管理应用程序),但是对于OS这个应用程序仍在使用2G的RAM,我可以在OS的资源监视器上看到它.
我希望我的应用程序在不需要使用大内存时将内存释放到操作系统.我可以在运行时使用java应用程序吗?
我的意思是当我的应用程序需要使用64MB的Ram,那么操作系统只给它64MB,当它需要2GB的RAM然后操作系统给它2GB,之后它需要64MB的ram然后操作系统再给它64MB,我不要浪费2000MB - 64MB = 1936MB.
我能这样做吗?
谢谢,