2015-10-05 107 views
2

這是我們的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的阿帕奇-camelbitronix交易管理器medispan。我們希望運行在32〜128MB內存。請您提供足夠的信息來建議我們以最佳/最小內存使用率運行此應用程序?

+1

如何衡量資源利用率?理想情況下,您應該使用jconsole,visual-vm等工具來了解堆上正在發生的事情。然後您可以調整permgen空間和其他參數。您還必須考慮併發使用情況,即活動用戶會話的數量。 – questzen

+1

當你說32到128MB的內存時,你指的是什麼:堆? PermGen的/元空間?特別是使用ehcache之類的東西,我認爲這會讓你的緩存無用,或者你需要更多的內存。我試着用@questzen的建議來分析像visualvm這樣的內存消耗。然後,你也可以開始考慮擺脫一些潛在的框架:嘗試使用普通的jdbc模板,而不是mybatis,將tomcat替換爲undersow,刪除駱駝,... –

回答

1

您需要運行一個Profiler,比如JProfile或VisualVM來查看什麼是cosuming內存。

我可以告訴你馬上你永遠不會下降到32MB與所有那些額外的庫在那裏。單獨的Apache Camel可能需要至少256MB才能可靠運行。而且Apache Camel不是應該嵌入到微服務中的東西。這是您的服務應從外部調用的服務。同樣使用JPA或幾乎任何緩存都會使得難以獲得那麼低的內存使用。

我確實在Spring Boot中有一些高容量的微型服務,運行時只有32MB-64MB,但他們基本上只是做了一些計算。所有這些額外的庫和服務將大大擴展您的內存使用量。