请教为何JVM不把空闲内存归还给操作系统

找找乐儿 2016-11-23 10:01:55
我们这有一个Jboss的web程序运行在linux上, 最近系统总是报警JAVA进程占用内存过高。
然后我在jboss的tomcat status monitor 可以看到jboss的jvm的内存使用情况是这样的

JVM
Free memory: 10089.94 MB Total memory: 10870.75 MB Max memory: 10870.75 MB

所以很奇怪的看到 JVM已经控制了能分配的最大内存量 10GB, 但是在这10GB中有9GB多是空闲的内存,但是JVM却没有把这些内存归还给操作系统。 我的理解是这里的free memory是JVM通过GC得到的内存,然而如如何把这些内存归还给操作系统就完全是JVM自己的算法来操作了。
我们的系统在晚间是没有用户使用的, 但是发现在大多数情况下,即便过了一个晚上, JVM还是没有把任何free memory 归还给操作系统。每次发生这样的情况 虽然我觉得这种情况对于我们的应用程序没有问题,但是linux系统一直报警,所以只能通过重启jboss来释放这些内存。
所以想听听各位高手的意见。 我们用的是java 6,是不是更新到java8 相应的jvm操控内存的性能会更好一些呢?
...全文
4264 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
嫩草终结者 2018-08-03
  • 打赏
  • 举报
回复
遇到同样的问题,不知道该怎么弄,-XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio好像是解决这个问题的,但是只对-XX:+UseSerialGC有效果,而我使用的是G1
太虚野老 2017-04-23
  • 打赏
  • 举报
回复
跟jboss无关
找找乐儿 2017-02-14
  • 打赏
  • 举报
回复
引用 1 楼 rumlee 的回复:
为什么要释放内存呢?linux报警,那你应该处理操作系统,而不应该是jboss。当然,如果你的系统本身有内存泄漏的话则另当别论。 如果同样功能的两个程序,一个占用内存少,一个占用内存多,如果要问哪个程序更优,这很难说。 程序不是占用内存越少越好,要知道内存就是用来消耗的。如果机器上所有的程序把内存基本耗完,那这种从另外一个角度来说,这是最优化的配置,因为硬件的利用率最高。
我不理解的是, JVM一直在申请未开发的内存,却不主动使用已经回收的内存,这样真的不是一个问题么?
找找乐儿 2017-02-14
  • 打赏
  • 举报
回复
引用 2 楼 S202060229 的回复:
我觉得你理解的有问题,GC是把占用的垃圾内存回收到JVM,而不是把JVM的内存回收给操作系统
我其实就是这样理解的,GC会把垃圾回收给JVM, 可是JVM在申请内存的时候却不使用回收来的内存,而是继续去未开发的内存里去申请,直到申请到定义的max的内存。 这样的问题是, 由于我们这边有其他的东西在监视系统那个的内存使用率,所以尽管程序只用很少的内存,但是却显示JVM使用了定义的最大内存。 我就想知道这个是不是JVM6的一个问题
S202060229 2016-12-27
  • 打赏
  • 举报
回复
我觉得你理解的有问题,GC是把占用的垃圾内存回收到JVM,而不是把JVM的内存回收给操作系统
rumlee 2016-12-26
  • 打赏
  • 举报
回复
为什么要释放内存呢?linux报警,那你应该处理操作系统,而不应该是jboss。当然,如果你的系统本身有内存泄漏的话则另当别论。 如果同样功能的两个程序,一个占用内存少,一个占用内存多,如果要问哪个程序更优,这很难说。 程序不是占用内存越少越好,要知道内存就是用来消耗的。如果机器上所有的程序把内存基本耗完,那这种从另外一个角度来说,这是最优化的配置,因为硬件的利用率最高。

6,788

社区成员

发帖
与我相关
我的任务
社区描述
JBoss技术交流
社区管理员
  • JBoss技术交流社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧