首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JVM的内存占用是多少,如何将其最小化?

问JVM的内存占用是多少,如何将其最小化?
EN

Stack Overflow用户
提问于 2016-07-24 20:52:58
回答 3查看 12.9K关注 0票数 10

我只想知道当开始产生多个JVM进程时,JavaVM (Sun,Linux)的实际占用空间是多少。当我记得很清楚的时候,它们应该共享rt.jar (也许更远?)。这些JVM是否共享JIT缓存(所有JVM都具有相同的类路径)?

我能做些什么来减少多实例JVM的开销吗?(除了为堆设置更小的限制之外)?

在编写应用程序时,我可以做些什么?

我可以共享内存区域吗?也许可以共享映射的内存块?

EN

回答 3

Stack Overflow用户

发布于 2016-07-24 21:36:59

This post描述了Java应用程序内存占用的构成。也就是说,如果你想减少内存占用,你需要减少这些部分: Java堆,Metaspace,代码缓存,直接缓冲区,线程数量等。

HotSpot JVM的实例之间不会为了共享数据而相互通信。它们基本上不共享任何东西,除了操作系统共享的东西,即动态库(.so)和只读内存映射文件(.jars)。

这取决于应用程序通过IPC机制提供进一步的共享,例如内存映射文件。

票数 6
EN

Stack Overflow用户

发布于 2016-07-24 21:33:48

这可能只是一个部分的答案。

JVM的内存占用量是多少?

Java应用程序的全部内存使用量由堆空间和非堆空间组成(我这样叫它)。仅举几个驻留在非堆空间中的示例: PermGen或Metaspace,直接从代码分配(malloc),NIO也使用本机内存。

如何最小化它?

堆通常占据了内存占用的最大部分。所以,我会从它开始。

至于非堆空间,您可以最小化: PermGen (如果您的最大大小是冗余的),线程堆栈(它们相当大,特别是在64位JMMs中)和代码缓存(当然是为了提高性能)。

这些JVM是否共享JIT缓存?

在正常情况下(我不知道其他情况),每个进程都有自己的内存占用空间。这实际上是进程与线程的不同之处。回到多个JVM,每个JVM都是一个单独的进程。

应该共享rt.jar

当然,如果您从相同的目录(相同的安装)启动Java,它们将共享相同的rt.jar,但只是作为类的源。例如,String类的加载次数与正在运行的JVM的数量一样多。

票数 5
EN

Stack Overflow用户

发布于 2016-09-13 01:03:40

为了补充其他答案,这里有几篇有见地的文章,列出了典型的JVM内存足迹值以及度量它们的方法:

https://spring.io/blog/2015/12/10/spring-boot-memory-performance

http://trustmeiamadeveloper.com/2016/03/18/where-is-my-memory-java/

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38552250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档