这是我们的maven MediSpan项目。其实这是一个REST
网络服务。通过GPI返回JSON
对于药物药物相互作用查询指定患者的代码。下面是一个休息查询的样本:如何以最小的内存运行弹簧引导脂肪罐?
http://localhost:8017/mspn/query?pid=1000&
gpis=83-20-00-30-20-03-10&gpis=64-99-10-02-12-03-20
这是我们项目的结构:
/opt/java/spring/boot/fat/jar/project/chorke─mspn─server/
├─ MediSpan.Documents.Monograph.css [ 1,697 Byte]
├─ MediSpan.Documents.Monograph.xslt [ 35,167 Byte]
├─ bitronix-tx-mgr-log-001 [ 2,097,173 Byte]
├─ bitronix-tx-mgr-log-002 [ 2,097,173 Byte]
└─ chorke─mspn─server.jar! [26,022,610 Byte]
├─ medispan/ [ 443,756 Byte]
├─ META-INF/ [ 33,702 Byte]
├─ org/springframework/boot/loader/ [ 165,003 Byte]
├─ com/chorke/ [ 27,633 Byte]
├─ application.properties [ 501 Byte]
├─ application.yml [ 2,234 Byte]
├─ MediSpan.Foundation.Config.xml [ 14,939 Byte]
├─ MediSpan.Foundation.Text.xml [ 9,003 Byte]
├─ log4j.xml [ 2,254 Byte]
└─ lib/ [25,688,056 Byte]
├─ aopalliance-1.0.jar
├─ btm-2.1.4.jar
├─ c3p0-0.9.1.2.jar
├─ camel-core-2.15.2.jar
├─ camel-jasypt-2.15.2.jar
├─ camel-quartz2-2.15.2.jar
├─ camel-spring-2.15.2.jar
├─ camel-spring-javaconfig-2.15.2.jar
├─ chorke-comn-spring-2.0.00-SNAPSHOT.jar [ 11,698 Byte]
├─ chorke-mspn-entity-2.0.00-SNAPSHOT.jar [ 13,486 Byte]
├─ chorke-mspn-parser-2.0.00-SNAPSHOT.jar [ 15,921 Byte]
├─ chorke-mspn-persis-2.0.00-SNAPSHOT.jar [ 23,328 Byte]
├─ chorke-mspn-utlity-2.0.00-SNAPSHOT.jar [ 25,684 Byte]
├─ commons-lang3-3.3.2.jar
├─ commons-logging-1.1.1.jar
├─ ehcache-core-2.6.11.jar
├─ jackson-annotations-2.4.6.jar
├─ jackson-core-2.4.6.jar
├─ jackson-databind-2.4.6.jar
├─ jasypt-1.9.2.jar
├─ javax.transaction-api-1.2.jar
├─ jaxb-core-2.2.11.jar
├─ jaxb-impl-2.2.11.jar
├─ log4j-1.2.17.jar
├─ medispan-business-5.1.10.jar
├─ medispan-concepts-5.1.10.jar
├─ medispan-conditions-5.1.10.jar
├─ medispan-documents-5.1.10.jar
├─ medispan-interactions-5.1.10.jar
├─ medispan-screening-5.1.10.jar
├─ medispan-utility-5.1.10.jar
├─ mybatis-3.2.8.jar
├─ mybatis-ehcache-1.0.2.jar
├─ mybatis-spring-1.2.2.jar
├─ ojdbc6-11.2.0.3.jar
├─ org.apache.servicemix.bundles.cglib-2.1_3_7.jar
├─ quartz-2.2.1.jar
├─ slf4j-api-1.7.12.jar
├─ slf4j-log4j12-1.7.12.jar
├─ snakeyaml-1.14.jar
├─ spring-aop-4.1.6.RELEASE.jar
├─ spring-beans-4.1.6.RELEASE.jar
├─ spring-boot-1.2.4.RELEASE.jar
├─ spring-boot-actuator-1.2.4.RELEASE.jar
├─ spring-boot-autoconfigure-1.2.4.RELEASE.jar
├─ spring-boot-starter-1.2.4.RELEASE.jar
├─ spring-boot-starter-actuator-1.2.4.RELEASE.jar
├─ spring-boot-starter-tomcat-1.2.4.RELEASE.jar
├─ spring-context-4.1.6.RELEASE.jar
├─ spring-context-support-4.1.6.RELEASE.jar
├─ spring-core-4.1.6.RELEASE.jar
├─ spring-expression-4.1.6.RELEASE.jar
├─ spring-jdbc-4.1.6.RELEASE.jar
├─ spring-jms-4.1.6.RELEASE.jar
├─ spring-messaging-4.1.6.RELEASE.jar
├─ spring-tx-4.1.6.RELEASE.jar
├─ spring-web-4.1.6.RELEASE.jar
├─ spring-webmvc-4.1.6.RELEASE.jar
├─ tomcat-embed-core-8.0.23.jar
├─ tomcat-embed-el-8.0.23.jar
├─ tomcat-embed-logging-juli-8.0.23.jar
└─ tomcat-embed-websocket-8.0.23.jar
这里运行这个胖子JAR项目和其基质的命令:
# without setting java option
java -jar chorke-mspn-server.jar
在41.824秒内启动BootstrapApplication(JVM运行为42.807)
- 使用的内存: 532858字节
- 承诺: 751616字节
- 最大: 1847808字节
- 9502类加载
做工精细。
# setting java option for 1024 MB
java -Xmx1024M -XX:MaxPermSize=768M -XX:+CMSClassUnloadingEnabled \
-jar chorke-mspn-server.jar
在42.134秒发起者BootstrapApplication(JVM运行43.084)
- 使用的内存: 160016千字节
- 所犯: 422912千字节
- 最大: 932352千字节
- 加载9505类
工作正常。
# setting java option for 512 MB
java -Xmx512M -XX:MaxPermSize=384M -XX:+CMSClassUnloadingEnabled \
-jar chorke-mspn-server.jar
在42.385秒发起者BootstrapApplication(JVM运行43.358)
- 使用的内存: 244280千字节
- 所犯: 463360千字节
- 最大: 465920千字节
- 加载9503类
工作正常。
# setting java option for 256 MB
java -Xmx256M -XX:MaxPermSize=192M -XX:+CMSClassUnloadingEnabled \
-jar chorke-mspn-server.jar
在42.202秒发起者BootstrapApplication(JVM运行43.174)
- 使用的内存: 244280千字节
- 所犯: 463360千字节
- 最大: 465920千字节
- 9503类加载
抛出异常[处理程序处理失败;嵌套的例外是java.lang.OutOfMemoryError:GC开销超出限制]与根源
java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.lang.Integer.valueOf(Integer.java:642)
at medispan.foundation.convert.ValueType.asValue(Unknown Source)
at medispan.foundation.dataaccess.providers.sql.SQLProvider.executeForResults(Unknown Source)
at medispan.foundation.dataaccess.providers.sql.SQLDataAccessProvider.innerExecuteForCollection(Unknown Source)
at medispan.foundation.dataaccess.DataAccessProvider.executeForCollection(Unknown Source)
at medispan.business.dataaccess.BusinessDataAccessManager.load(Unknown Source)
at medispan.business.dataaccess.QueryPropertyValues.getPropertyValue(Unknown Source)
at medispan.business.dataaccess.QueryPropertyValues.getInnerValue(Unknown Source)
more..
此应用程序由具有嵌入式Tomcat服务器,春天开机,Spring MVC的,MyBatis的,阿帕奇-camel,bitronix交易管理器,medispan。我们希望运行在32〜128MB
内存。请您提供足够的信息来建议我们以最佳/最小内存使用率运行此应用程序?
如何衡量资源利用率?理想情况下,您应该使用jconsole,visual-vm等工具来了解堆上正在发生的事情。然后您可以调整permgen空间和其他参数。您还必须考虑并发使用情况,即活动用户会话的数量。 – questzen
当你说32到128MB的内存时,你指的是什么:堆? PermGen的/元空间?特别是使用ehcache之类的东西,我认为这会让你的缓存无用,或者你需要更多的内存。我试着用@questzen的建议来分析像visualvm这样的内存消耗。然后,你也可以开始考虑摆脱一些潜在的框架:尝试使用普通的jdbc模板,而不是mybatis,将tomcat替换为undersow,删除骆驼,... –