首页 / JAVA / java – JVM内存使用失控
java – JVM内存使用失控
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – JVM内存使用失控,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3115字,纯文字阅读大概需要5分钟。
内容图文
![java – JVM内存使用失控](/upload/InfoBanner/zyjiaocheng/952/14303572c67c4fedac4c1150b147adf2.jpg)
我有一个Tomcat webapp,它代表客户端执行一些漂亮的内存和CPU密集型任务.这是正常的,是所需的功能.但是,当我运行Tomcat时,内存使用量会随着时间的推移而猛增至4.0GB以上,此时我通常会杀死该进程,因为它会破坏我在开发计算机上运行的所有其他内容:
我以为我无意中用我的代码引入了内存泄漏,但在用VisualVM检查后,我看到了一个不同的故事:
VisualVM显示堆占用大约一GB的RAM,这就是我用CATALINA_OPTS =“ – Xms256m -Xmx1024”设置的.
根据VisualVM的说法,为什么我的系统认为这个过程占用了大量的内存,它几乎没有占用任何内容?
经过一番进一步的嗅探,我注意到如果在应用程序中同时运行多个作业,则内存不会被释放.但是,如果我在将另一个作业提交给由ExecutorService提供服务的BlockingQueue之前等待每个作业完成,那么内存将被有效地回收.我该怎么调试呢?为什么垃圾收集/内存重用会有所不同?
解决方法:
您无法控制要控制的内容,-Xmx仅控制Java堆,它不控制JVM对本机内存的消耗,而JVM根据实现完全不同地使用. VisualVM只显示Heap正在消耗的内容,它不会显示整个JVM作为本机内存消耗的操作系统进程.您将不得不使用操作系统级工具来查看它,并且它们将报告完全不同的数字,通常比VisualVM报告的任何数字都大得多,因为JVM以完全不同的方式使用本机内存.
来自以下文章Thanks for the Memory ( Understanding How the JVM uses Native Memory on Windows and Linux )
维护堆和垃圾收集器使用您无法控制的本机内存.
More native memory is required to maintain the state of the
memory-management system maintaining the Java heap. Data structures
must be allocated to track free storage and record progress when
collecting garbage. The exact size and nature of these data structures
varies with implementation, but many are proportional to the size of
the heap.
并且JIT编译器使用本机内存,就像javac一样
Bytecode compilation uses native memory (in the same way that a static
compiler such as gcc requires memory to run), but both the input (the
bytecode) and the output (the executable code) from the JIT must also
be stored in native memory. Java applications that contain many
JIT-compiled methods use more native memory than smaller applications.
然后你有使用本机内存的类加载器
Java applications are composed of classes that define object structure
and method logic. They also use classes from the Java runtime class
libraries (such as java.lang.String) and may use third-party
libraries. These classes need to be stored in memory for as long as
they are being used. How classes are stored varies by implementation.
我甚至不会开始引用关于线程的部分,我想你明白了
-Xmx不控制你认为它控制的是什么,它控制着JVM堆,而不是一切
进入JVM堆,并且堆占用了您指定的更多本机内存
管理和簿记.
这是一个very detailed article on how the JVM allocates and manages memory,根据你的问题假设,它并不像你期望的那么简单,值得全面阅读.
许多实现中的ThreadStack大小具有最小限制,这些限制因操作系统和JVM版本而异;如果将限制设置为低于JVM或OS的本机操作系统限制,则会忽略threadstack设置(有时必须设置ulix on * nix).其他命令行选项以相同的方式工作,当提供的值太小时,默认默认为更高的值.不要假设传入的所有值都代表实际使用的值.
类加载器和Tomcat有不止一个,占用了大量内存,而这些内存很难被记录下来. JIT占用了大量的内存,随着时间的推移交易空间,这在大多数情况下是一个很好的交易.
内容总结
以上是互联网集市为您收集整理的java – JVM内存使用失控全部内容,希望文章能够帮你解决java – JVM内存使用失控所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。