程序先执行一个start
方法来占用大量内存,然后执行endEmpty
一直调用System.gc()
运行后,在任务管理器能看到程序的内存占用马上就达到了4G, 但是start
方法出栈之后内存占用却一直不下降
这是正常的吗? 如何才能释放这些内存呢?
而且如果在start方法内调用System.gc()
, 却能起作用, 这个方法到底什么时候有用什么时候无效...
static final long BEGIN_MILLIS = System.currentTimeMillis();
public static void main(String[] args) {
HelloWorld h = new HelloWorld();
h.start();
h.endEmpty();
}
public void start() {
System.out.println("start");
ArrayList<Object> list = new ArrayList<Object>();
while (System.currentTimeMillis() - BEGIN_MILLIS < TimeUnit.SECONDS.toMillis(10)) {
list.add(System.getProperties().clone());
// System.gc();
}
}
public void endEmpty() {
System.out.println("end");
while (true) {
System.gc();
}
}
应该有两个原因:
另外, 监控java内存的使用情况最好使用 visualvm(jvisualvm) 或者 jstat 之类java提供的工具监控, 而不是操作系统提供的工具. 因为操作系统只是监控java程序本身申请了多少内存, 但是java申请了这么多内存并不见得一定会用这么多, 也不见得用完以后一定会换给操作系统.
具体可以了解下内存相关的配置.
给你看几张图吧: