我想就java堆空间的基本疑问征求您的意见。
我想知道Java运行时自己获取的对象分配的堆空间或整个Java内存空间的百分比。
同样的问题适用于Java servlet或Java EE容器,如Tomcat或任何其他应用程序服务器。
当我运行一个极小的JSP页面时,我检查了tomcat的一些基本堆转储。我可以看到它已经占用了17 MB,我看到为catalina类加载器类分配了一些对象。我使用Eclipse Memory分析工具进行了分析。
我发现当我运行独立的Java程序时,我发现它有一些由类加载器加载的char []。
当我运行更复杂的场景时,可能会分配更多的对象。
我能以某种方式影响使用某些VM参数或其他东西影响java运行时类或对象分配的基本加载吗?
答案 0 :(得分:3)
使用Java 9和Project Jigsaw,JVM是模块化的,现在可以构建简化的JVM运行时。您可以使用jlink
工具使用基本Java模块构建自定义JRE,并将代码构建为shown in this tutorial。
作为副作用,这清理了Java内部类中演变的奇怪依赖关系。这应该会导致更快的启动,因为在启动期间将会加载更少的类,直到您声明import
。
答案 1 :(得分:1)
查看Runtime课程。它为JRE提供了一些基本的内存利用率数据。
对于整体的内存利用率,Java往往会占用大量内存。运行Tomcat时,17 MB是少量的。如果您在具有严重内存限制的设备上运行,则可以查找设计为占用空间较小的服务器。
答案 2 :(得分:1)
我无法真正提供答案(除了说“不”),但这对评论来说太长了。
Java非常需要内存,17 MB就是我拒绝接受的东西。当您的服务器获得大量流量时,可能会有数百个请求在飞行中,每个请求消耗的线程stack可能只有1兆字节,而其数据可能要多得多。将有缓存消耗大量剩余内存 - 无论你有多少内存,你都会找到它的用途。
这种渴望是设计的 - 服务器意味着一台大型机器,因为几千兆字节比节省一些内存所需的几天工作便宜得多。这并不意味着草率的设计 - 相反,每一块软件都有无数的优化。只是他们专注于速度并且针对大型机器进行了调整(例如,你的JSP被编译成一个Servler,它被缓存。这肯定比每次重新生成它更好,不是吗?)。
然后是GC,它进一步增加了所需的内存。这是值得的,因为它节省了我们寻找内存分配错误的日子。
是的......确切地说..我看到一些服务器达到500 MB,我的堆空间为1.5 GB,整体RAM为2GB ......在这种情况下,我的应用程序实际上有1GB,这对于管理来说非常困难我们
我的启动服务器使用4 GB(16 GB)。它目前可以运行得少得多,但我们预计在一年内可能需要很多才能获得完整的性能。有些服务器使用数百GB(并且遇到很长时间GC暂停的问题)。
您可以在单个Tomcat实例上打包多个servlet(假设您需要多个servlet),而不是尝试最小化内存使用量。然后你必须得到更大的服务器,但你可以获得更多的服务器。