SlideShare une entreprise Scribd logo
1  sur  26
Axis2 client memory leak
Outline
• Issue & diagnosis
• Postmortem from technique point
  – Axis2 1.4/1.4.1/1.5.6 client
  – Implement & design issue
Issue




CServer exhaust 8G memory -> memory leak
diagnosis
      jmap –histo               pid

num     #instances         #bytes class name
----------------------------------------------
   1:       1001744      246906600 [C //char array
   2:       2855952      137085696 edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap$Segment
   3:        282338      115692192 [I // int array
   4:        677362      102508648 [Ljava.util.HashMap$Entry;
   5:        192117       99164392 [B // byte array
   6:       2856122       91732120 [Ledu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap$HashEntry;
   7:       2855952       91390464 edu.emory.mathcs.backport.java.util.concurrent.locks.ReentrantLock$NonfairSync
   8:       1337498       53499920 java.lang.String
   9:        433634       43130120 [Ljava.lang.Object;
  10:        597908       38266112 java.util.HashMap




      From the histogram, the memory leak is caused by Axis2.
       1) The main change in this release is using web service client (axis2 1.4.1)
       2) char[] / edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap
       3) Google ‘axis2 1.4.1 concurrentHashMap memory leak‘
diagnosis
 jmap –dump:file=cdump pid

• We got a 2.39G memory heap dump
  – Very fast, less than 30 seconds (because 8G
    memory in production)
• Problem : too big to open in dev box
  – Need enough physical memory
  – (May) need 64 bit OS
  – Try Jhat/Jprofile/YJP/Jmat eclipse plugin
    (windows/2G)
                             Open by Jmat standalone application
diagnosis




AxisConfiguration retain 540.9m heap
diagnosis




Hashtable allEndPoints holds more than 2k axis2 endpoint instances
diagnosis




All of the endpoint instances are about FavoriteService
1) Confirm in the code, only FavoriteService related did not call cleanup
Axis2 1.4 memory leak
• Reproduce

for( int i=0;i<count; i++) {
    VersionStub stub = new VersionStub(configContext,null);
    GetVersion request = new GetVersion();
    stub.getVersion(request);
}
Axis2 1.4 memory leak
 • Informal Model (OO design)



AxisConfiguration

Map allServices = new Hashtable();
Map allEndpoints = new Hashtable();
Axis2 1.4 memory leak
• Cause : Stub Initiation, add into AxisConfiguration




   //Init, Add
   allServices.put(serviceName, axisService);
   ..
   allEndpoints.put(serviceName + "." + endpointName, axisService);
Axis2 1.4 memory leak
• Cause : Stub Finalize
  //Stub
  protected void finalize() throws Throwable {
          super.finalize();
          cleanup();
  }

  public void cleanup() throws AxisFault {
          _service.getAxisConfiguration().removeService(_service.getName());
  }



 //AsixConiguration
 public synchronized void removeService(String name) throws AxisFault {
         AxisService service = (AxisService) allServices.remove(name);
         if (service != null) {
             AxisServiceGroup serviceGroup = service.getAxisServiceGroup();
             serviceGroup.removeService(name);
             log.debug(Messages.getMessage("serviceremoved", name));
         }
     }
Axis2 1.4 memory leak
• Cause : Client Finalize
  //ServiceClient
  protected void finalize() throws Throwable {
          super.finalize();
          cleanup();
  }

  public void cleanup() throws AxisFault {
    …
          axisConfiguration.removeServiceGroup(serviceGroupName);
    …
  }



 //AsixConiguration
 public AxisServiceGroup removeServiceGroup(String serviceGroupName) throws AxisFault {
            …
            Iterator services = axisServiceGroup.getServices();
            while (services.hasNext()) {
                          AxisService axisService = (AxisService) services.next();
                          allServices.remove(axisService.getName());
                          …
            }
            …
Axis2 1.4 memory leak
• Cause
  //Init, Add
  allServices.put(serviceName, axisService);
  ..
  allEndpoints.put(serviceName + "." + endpointName, axisService);




  //Cleanup(Finalize), Remove
  allServices.put(serviceName, axisService);




• Memory Leak :             allEndpoints
Axis2 1.4.1 fix
• Fix the bug AXIS2-3870
//AsixConiguration.removeServiceGroup

//removes the endpoints to this service
String serviceName = axisService.getName();
String key = null;
for (Iterator iter = axisService.getEndpoints().keySet().iterator(); iter.hasNext();){
   key = serviceName + "." + (String)iter.next();
   this.allEndpoints.remove(key);
}
Axis2 1.4.1 memory leak
• Reproduce

for( int i=0;i<count; i++) {
    VersionStub stub = new VersionStub(configContext,null);
    GetVersion request = new GetVersion();
    stub.getVersion(request);
    stub.cleanup();
}



   Programmer: 1.4 has memory leak issue, so call cleanup
Axis2 1.4.1 memory leak
• Cause : Stub Finalize (no change)
  //Stub
  protected void finalize() throws Throwable {
          super.finalize();
          cleanup();
  }

  public void cleanup() throws AxisFault {
          _service.getAxisConfiguration().removeService(_service.getName());
  }



 //AsixConiguration
 public synchronized void removeService(String name) throws AxisFault {
         AxisService service = (AxisService) allServices.remove(name);
         if (service != null) {
             AxisServiceGroup serviceGroup = service.getAxisServiceGroup();
             serviceGroup.removeService(name);
             log.debug(Messages.getMessage("serviceremoved", name));
         }
     }
Axis2 1.4.1 memory leak
• Cause: Client Finalize (no change)
  //ServiceClient
  protected void finalize() throws Throwable {
          super.finalize();
          cleanup();
  }

  public void cleanup() throws AxisFault {
    …
          axisConfiguration.removeServiceGroup(serviceGroupName);
    …
  }
Axis2 1.4.1 memory leak
• Cause: Client Finalize (no change)
//AsixConiguration
public AxisServiceGroup removeServiceGroup(String serviceGroupName) throws AxisFault {
           …
           Iterator services = axisServiceGroup.getServices();
           while (services.hasNext()) {
                         AxisService axisService = (AxisService) services.next();
                         allServices.remove(axisService.getName());

                   …
                   for (Iterator iter = axisService.getEndpoints().keySet().iterator(); iter.
                          key = serviceName + "." + (String)iter.next();
                          this.allEndpoints.remove(key);
                   }
                   …

          }

                  Servce are already removed from ServiceGroup in Stub cleanup
          …
}
                  The while loop would never enter
Axis2 1.4.1 memory leak
• Cause
  – Stub cleanup and ServiceClient cleanup have
    dependency
  – Can not call in below order

      Stub.cleanup
      ServiceClient.cleanup



• Two are two memory leak bugs in 1.4, 1.4.1 only
  fix 1 bug
Axis2 1.5(.6) fix
• Fix the bug AXIS2-4007 AXIS2-4163
  //Stub
  protected void finalize() throws Throwable {
          super.finalize();
          cleanup();
  }

  public void cleanup() throws AxisFault {
          // _service.getAxisConfiguration().removeService(_service.getName());
          _serviceClient.cleanup();
  }
Implement issue
• Forget to cleanup
  – Container object: add only, no remove
  – Resource object: apply only, no return/close


• Cleanup dependency
  – One object cleanup depend on other objects
  – Two object cleanup/two method has order
    dependency
Design Issue
• AxisConfiguration   is a global shared object
  – Usually only 1 instance even in client side.


• Purpose for put service/endpoint map in this
  global object AxisConfiguration ?
Design Issue
• Message Dispatch in server side
// RequestURIBasedServiceDispatcher
public AxisService findService(MessageContext messageContext) throws AxisFault {

          AxisConfiguration registry = configurationContext.getAxisConfiguration();

           AxisService axisService = registry.getService(values[0]);

           // If the axisService is not null we get the binding that the request came to add
           // add it as a property to the messageContext
           if (axisService != null) {
                 Map endpoints = axisService.getEndpoints();
                 if (endpoints != null) {
                     if (endpoints.size() == 1) {
                            messageContext.setProperty(WSDL2Constants.ENDPOINT_LOCAL_NAME,
                           endpoints.get(axisService.getEndpointName()));
                     } else {
                         String endpointName = values[0].substring(values[0].indexOf(".") + 1);
                         messageContext.setProperty(WSDL2Constants.ENDPOINT_LOCAL_NAME,
                         endpoints.get(endpointName));
                     }
                 }
            }

           return axisService;
}
Design Issue
• Service is ‘singleton’ in server side
   // AxisConfiguration
   public AxisService getService(String name) throws AxisFault {
           AxisService axisService = (AxisService) allServices.get(name);
           if (axisService != null) {
               if (axisService.isActive()) {
                    return axisService;
               } else {
                    throw new AxisFault(Messages
                             .getMessage("serviceinactive", name));
               }
           } else {
               axisService = (AxisService) allEndpoints.get(name);
               if (axisService != null) {
                    if (axisService.isActive()) {
                        return axisService;
                    } else {
                        throw new AxisFault(Messages
                                 .getMessage("serviceinactive", name));
                    }
               }
           }
           return null;
       }
Design Issue
• Client side
  – (Usually) New instance every method invocation
  – No need for message routing
     • Why still register in Axi2Configuration ?

      axisConfig = configContext.getAxisConfiguration();
      if (axisService == null) {
          axisService = createAnonymousService();
      }
      this.axisService = axisService;
      if (axisConfig.getService(axisService.getName()) == null) {
          axisService.setClientSide(true);
          axisConfig.addService(axisService);
      } else {
          …
      }

       …

Contenu connexe

Tendances

Continual process improvement with kaizen v1
Continual process improvement with kaizen v1Continual process improvement with kaizen v1
Continual process improvement with kaizen v1Syed Mahsud Ali
 
A short history of Agile software development
A short history of Agile software developmentA short history of Agile software development
A short history of Agile software developmentKane Mar
 
The Importance of having a Sprint Goal
The Importance of having a Sprint GoalThe Importance of having a Sprint Goal
The Importance of having a Sprint GoalAbdul Muhaimin
 
Dive into sprint planning
Dive into sprint planning Dive into sprint planning
Dive into sprint planning Priyanka Nomula
 
Effective Software Release Management
Effective Software Release ManagementEffective Software Release Management
Effective Software Release ManagementMichael Degnan
 
Effective Agile Retrospectives
Effective Agile RetrospectivesEffective Agile Retrospectives
Effective Agile RetrospectivesYuval Yeret
 
Más y Mejores Retrospectivas
Más y Mejores RetrospectivasMás y Mejores Retrospectivas
Más y Mejores RetrospectivasJorge Bejar
 
Agile-overview: Agile Manifesto, Agile principles and Agile Methodologies
Agile-overview: Agile Manifesto, Agile principles and Agile MethodologiesAgile-overview: Agile Manifesto, Agile principles and Agile Methodologies
Agile-overview: Agile Manifesto, Agile principles and Agile MethodologiesBalaji Sathram
 
Engineering Economics|Work Breakdown Structure
Engineering Economics|Work Breakdown StructureEngineering Economics|Work Breakdown Structure
Engineering Economics|Work Breakdown Structureumair khan
 
Agile Kaizen: Agile Product Management - Course Slides
Agile Kaizen: Agile Product Management - Course SlidesAgile Kaizen: Agile Product Management - Course Slides
Agile Kaizen: Agile Product Management - Course SlidesProyectalis / Improvement21
 
Agile methodology
Agile methodologyAgile methodology
Agile methodologyDhruv Kumar
 
Agenda & MoM
Agenda & MoMAgenda & MoM
Agenda & MoMMK
 

Tendances (20)

Continual process improvement with kaizen v1
Continual process improvement with kaizen v1Continual process improvement with kaizen v1
Continual process improvement with kaizen v1
 
Agile Release & Iteration Planning
Agile Release & Iteration Planning   Agile Release & Iteration Planning
Agile Release & Iteration Planning
 
2016 06 om presentatie omgaan met klachten
2016 06 om presentatie omgaan met klachten2016 06 om presentatie omgaan met klachten
2016 06 om presentatie omgaan met klachten
 
A short history of Agile software development
A short history of Agile software developmentA short history of Agile software development
A short history of Agile software development
 
The Importance of having a Sprint Goal
The Importance of having a Sprint GoalThe Importance of having a Sprint Goal
The Importance of having a Sprint Goal
 
Scrum values
Scrum valuesScrum values
Scrum values
 
Dive into sprint planning
Dive into sprint planning Dive into sprint planning
Dive into sprint planning
 
Effective Software Release Management
Effective Software Release ManagementEffective Software Release Management
Effective Software Release Management
 
Project Management Basics
Project Management BasicsProject Management Basics
Project Management Basics
 
Effective Agile Retrospectives
Effective Agile RetrospectivesEffective Agile Retrospectives
Effective Agile Retrospectives
 
Más y Mejores Retrospectivas
Más y Mejores RetrospectivasMás y Mejores Retrospectivas
Más y Mejores Retrospectivas
 
Agile Release & Iteration Planning
Agile Release & Iteration PlanningAgile Release & Iteration Planning
Agile Release & Iteration Planning
 
Agile-overview: Agile Manifesto, Agile principles and Agile Methodologies
Agile-overview: Agile Manifesto, Agile principles and Agile MethodologiesAgile-overview: Agile Manifesto, Agile principles and Agile Methodologies
Agile-overview: Agile Manifesto, Agile principles and Agile Methodologies
 
Retrospectiva
RetrospectivaRetrospectiva
Retrospectiva
 
Engineering Economics|Work Breakdown Structure
Engineering Economics|Work Breakdown StructureEngineering Economics|Work Breakdown Structure
Engineering Economics|Work Breakdown Structure
 
Project communications management PMBOK Sixth Edition
Project communications management  PMBOK Sixth EditionProject communications management  PMBOK Sixth Edition
Project communications management PMBOK Sixth Edition
 
Agile Kaizen: Agile Product Management - Course Slides
Agile Kaizen: Agile Product Management - Course SlidesAgile Kaizen: Agile Product Management - Course Slides
Agile Kaizen: Agile Product Management - Course Slides
 
Agile methodology
Agile methodologyAgile methodology
Agile methodology
 
Agenda & MoM
Agenda & MoMAgenda & MoM
Agenda & MoM
 
Best Practices for Running More Effective Meetings
Best Practices for Running More Effective MeetingsBest Practices for Running More Effective Meetings
Best Practices for Running More Effective Meetings
 

Similaire à Axis2 client memory leak

Programming Sideways: Asynchronous Techniques for Android
Programming Sideways: Asynchronous Techniques for AndroidProgramming Sideways: Asynchronous Techniques for Android
Programming Sideways: Asynchronous Techniques for AndroidEmanuele Di Saverio
 
Think Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJSThink Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJSAdam L Barrett
 
Avoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.jsAvoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.jscacois
 
DjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling DisqusDjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling Disquszeeg
 
Aplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackAplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackNelson Glauber Leal
 
Seastar @ NYCC++UG
Seastar @ NYCC++UGSeastar @ NYCC++UG
Seastar @ NYCC++UGAvi Kivity
 
Futures e abstração - QCon São Paulo 2015
Futures e abstração - QCon São Paulo 2015Futures e abstração - QCon São Paulo 2015
Futures e abstração - QCon São Paulo 2015Leonardo Borges
 
Scala @ TechMeetup Edinburgh
Scala @ TechMeetup EdinburghScala @ TechMeetup Edinburgh
Scala @ TechMeetup EdinburghStuart Roebuck
 
Grand Central Dispatch
Grand Central DispatchGrand Central Dispatch
Grand Central Dispatchcqtt191
 
Celery - A Distributed Task Queue
Celery - A Distributed Task QueueCelery - A Distributed Task Queue
Celery - A Distributed Task QueueDuy Do
 
Node.js: Continuation-Local-Storage and the Magic of AsyncListener
Node.js: Continuation-Local-Storage and the Magic of AsyncListenerNode.js: Continuation-Local-Storage and the Magic of AsyncListener
Node.js: Continuation-Local-Storage and the Magic of AsyncListenerIslam Sharabash
 
MongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-esMongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-esMongoDB
 
[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade ServerlessKatyShimizu
 
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade ServerlessKatyShimizu
 
OSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at Netflix
OSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at NetflixOSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at Netflix
OSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at NetflixManish Pandit
 
FaaS by Microsoft: Azure Functions and Azure Durable Functions
FaaS by Microsoft: Azure Functions and Azure Durable FunctionsFaaS by Microsoft: Azure Functions and Azure Durable Functions
FaaS by Microsoft: Azure Functions and Azure Durable FunctionsChristian Lechner
 
An Introduction to Celery
An Introduction to CeleryAn Introduction to Celery
An Introduction to CeleryIdan Gazit
 
Seastar @ SF/BA C++UG
Seastar @ SF/BA C++UGSeastar @ SF/BA C++UG
Seastar @ SF/BA C++UGAvi Kivity
 

Similaire à Axis2 client memory leak (20)

Programming Sideways: Asynchronous Techniques for Android
Programming Sideways: Asynchronous Techniques for AndroidProgramming Sideways: Asynchronous Techniques for Android
Programming Sideways: Asynchronous Techniques for Android
 
Think Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJSThink Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJS
 
Avoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.jsAvoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.js
 
DjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling DisqusDjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling Disqus
 
Aplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackAplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e Jetpack
 
Seastar @ NYCC++UG
Seastar @ NYCC++UGSeastar @ NYCC++UG
Seastar @ NYCC++UG
 
Futures e abstração - QCon São Paulo 2015
Futures e abstração - QCon São Paulo 2015Futures e abstração - QCon São Paulo 2015
Futures e abstração - QCon São Paulo 2015
 
ES6 Overview
ES6 OverviewES6 Overview
ES6 Overview
 
Scala @ TechMeetup Edinburgh
Scala @ TechMeetup EdinburghScala @ TechMeetup Edinburgh
Scala @ TechMeetup Edinburgh
 
Grand Central Dispatch
Grand Central DispatchGrand Central Dispatch
Grand Central Dispatch
 
Celery - A Distributed Task Queue
Celery - A Distributed Task QueueCelery - A Distributed Task Queue
Celery - A Distributed Task Queue
 
Node.js: Continuation-Local-Storage and the Magic of AsyncListener
Node.js: Continuation-Local-Storage and the Magic of AsyncListenerNode.js: Continuation-Local-Storage and the Magic of AsyncListener
Node.js: Continuation-Local-Storage and the Magic of AsyncListener
 
MongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-esMongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-es
 
[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless
 
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
 
OSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at Netflix
OSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at NetflixOSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at Netflix
OSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at Netflix
 
FaaS by Microsoft: Azure Functions and Azure Durable Functions
FaaS by Microsoft: Azure Functions and Azure Durable FunctionsFaaS by Microsoft: Azure Functions and Azure Durable Functions
FaaS by Microsoft: Azure Functions and Azure Durable Functions
 
An Introduction to Celery
An Introduction to CeleryAn Introduction to Celery
An Introduction to Celery
 
Seastar @ SF/BA C++UG
Seastar @ SF/BA C++UGSeastar @ SF/BA C++UG
Seastar @ SF/BA C++UG
 
Anti patterns
Anti patternsAnti patterns
Anti patterns
 

Plus de feng lee

Guice in athena
Guice in athenaGuice in athena
Guice in athenafeng lee
 
Bloom filter
Bloom filterBloom filter
Bloom filterfeng lee
 
Hadoop 安装
Hadoop 安装Hadoop 安装
Hadoop 安装feng lee
 
Mysql story in poi dedup
Mysql story in poi dedupMysql story in poi dedup
Mysql story in poi dedupfeng lee
 
Effective java - concurrency
Effective java - concurrencyEffective java - concurrency
Effective java - concurrencyfeng lee
 

Plus de feng lee (6)

Guice in athena
Guice in athenaGuice in athena
Guice in athena
 
Bloom filter
Bloom filterBloom filter
Bloom filter
 
Hadoop 安装
Hadoop 安装Hadoop 安装
Hadoop 安装
 
Mysql story in poi dedup
Mysql story in poi dedupMysql story in poi dedup
Mysql story in poi dedup
 
Effective java - concurrency
Effective java - concurrencyEffective java - concurrency
Effective java - concurrency
 
Maven
MavenMaven
Maven
 

Dernier

Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...apidays
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfOverkill Security
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Zilliz
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024The Digital Insurer
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 

Dernier (20)

Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 

Axis2 client memory leak

  • 2. Outline • Issue & diagnosis • Postmortem from technique point – Axis2 1.4/1.4.1/1.5.6 client – Implement & design issue
  • 3. Issue CServer exhaust 8G memory -> memory leak
  • 4. diagnosis jmap –histo pid num #instances #bytes class name ---------------------------------------------- 1: 1001744 246906600 [C //char array 2: 2855952 137085696 edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap$Segment 3: 282338 115692192 [I // int array 4: 677362 102508648 [Ljava.util.HashMap$Entry; 5: 192117 99164392 [B // byte array 6: 2856122 91732120 [Ledu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap$HashEntry; 7: 2855952 91390464 edu.emory.mathcs.backport.java.util.concurrent.locks.ReentrantLock$NonfairSync 8: 1337498 53499920 java.lang.String 9: 433634 43130120 [Ljava.lang.Object; 10: 597908 38266112 java.util.HashMap From the histogram, the memory leak is caused by Axis2. 1) The main change in this release is using web service client (axis2 1.4.1) 2) char[] / edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap 3) Google ‘axis2 1.4.1 concurrentHashMap memory leak‘
  • 5. diagnosis jmap –dump:file=cdump pid • We got a 2.39G memory heap dump – Very fast, less than 30 seconds (because 8G memory in production) • Problem : too big to open in dev box – Need enough physical memory – (May) need 64 bit OS – Try Jhat/Jprofile/YJP/Jmat eclipse plugin (windows/2G) Open by Jmat standalone application
  • 7. diagnosis Hashtable allEndPoints holds more than 2k axis2 endpoint instances
  • 8. diagnosis All of the endpoint instances are about FavoriteService 1) Confirm in the code, only FavoriteService related did not call cleanup
  • 9. Axis2 1.4 memory leak • Reproduce for( int i=0;i<count; i++) { VersionStub stub = new VersionStub(configContext,null); GetVersion request = new GetVersion(); stub.getVersion(request); }
  • 10. Axis2 1.4 memory leak • Informal Model (OO design) AxisConfiguration Map allServices = new Hashtable(); Map allEndpoints = new Hashtable();
  • 11. Axis2 1.4 memory leak • Cause : Stub Initiation, add into AxisConfiguration //Init, Add allServices.put(serviceName, axisService); .. allEndpoints.put(serviceName + "." + endpointName, axisService);
  • 12. Axis2 1.4 memory leak • Cause : Stub Finalize //Stub protected void finalize() throws Throwable { super.finalize(); cleanup(); } public void cleanup() throws AxisFault { _service.getAxisConfiguration().removeService(_service.getName()); } //AsixConiguration public synchronized void removeService(String name) throws AxisFault { AxisService service = (AxisService) allServices.remove(name); if (service != null) { AxisServiceGroup serviceGroup = service.getAxisServiceGroup(); serviceGroup.removeService(name); log.debug(Messages.getMessage("serviceremoved", name)); } }
  • 13. Axis2 1.4 memory leak • Cause : Client Finalize //ServiceClient protected void finalize() throws Throwable { super.finalize(); cleanup(); } public void cleanup() throws AxisFault { … axisConfiguration.removeServiceGroup(serviceGroupName); … } //AsixConiguration public AxisServiceGroup removeServiceGroup(String serviceGroupName) throws AxisFault { … Iterator services = axisServiceGroup.getServices(); while (services.hasNext()) { AxisService axisService = (AxisService) services.next(); allServices.remove(axisService.getName()); … } …
  • 14. Axis2 1.4 memory leak • Cause //Init, Add allServices.put(serviceName, axisService); .. allEndpoints.put(serviceName + "." + endpointName, axisService); //Cleanup(Finalize), Remove allServices.put(serviceName, axisService); • Memory Leak : allEndpoints
  • 15. Axis2 1.4.1 fix • Fix the bug AXIS2-3870 //AsixConiguration.removeServiceGroup //removes the endpoints to this service String serviceName = axisService.getName(); String key = null; for (Iterator iter = axisService.getEndpoints().keySet().iterator(); iter.hasNext();){ key = serviceName + "." + (String)iter.next(); this.allEndpoints.remove(key); }
  • 16. Axis2 1.4.1 memory leak • Reproduce for( int i=0;i<count; i++) { VersionStub stub = new VersionStub(configContext,null); GetVersion request = new GetVersion(); stub.getVersion(request); stub.cleanup(); } Programmer: 1.4 has memory leak issue, so call cleanup
  • 17. Axis2 1.4.1 memory leak • Cause : Stub Finalize (no change) //Stub protected void finalize() throws Throwable { super.finalize(); cleanup(); } public void cleanup() throws AxisFault { _service.getAxisConfiguration().removeService(_service.getName()); } //AsixConiguration public synchronized void removeService(String name) throws AxisFault { AxisService service = (AxisService) allServices.remove(name); if (service != null) { AxisServiceGroup serviceGroup = service.getAxisServiceGroup(); serviceGroup.removeService(name); log.debug(Messages.getMessage("serviceremoved", name)); } }
  • 18. Axis2 1.4.1 memory leak • Cause: Client Finalize (no change) //ServiceClient protected void finalize() throws Throwable { super.finalize(); cleanup(); } public void cleanup() throws AxisFault { … axisConfiguration.removeServiceGroup(serviceGroupName); … }
  • 19. Axis2 1.4.1 memory leak • Cause: Client Finalize (no change) //AsixConiguration public AxisServiceGroup removeServiceGroup(String serviceGroupName) throws AxisFault { … Iterator services = axisServiceGroup.getServices(); while (services.hasNext()) { AxisService axisService = (AxisService) services.next(); allServices.remove(axisService.getName()); … for (Iterator iter = axisService.getEndpoints().keySet().iterator(); iter. key = serviceName + "." + (String)iter.next(); this.allEndpoints.remove(key); } … } Servce are already removed from ServiceGroup in Stub cleanup … } The while loop would never enter
  • 20. Axis2 1.4.1 memory leak • Cause – Stub cleanup and ServiceClient cleanup have dependency – Can not call in below order Stub.cleanup ServiceClient.cleanup • Two are two memory leak bugs in 1.4, 1.4.1 only fix 1 bug
  • 21. Axis2 1.5(.6) fix • Fix the bug AXIS2-4007 AXIS2-4163 //Stub protected void finalize() throws Throwable { super.finalize(); cleanup(); } public void cleanup() throws AxisFault { // _service.getAxisConfiguration().removeService(_service.getName()); _serviceClient.cleanup(); }
  • 22. Implement issue • Forget to cleanup – Container object: add only, no remove – Resource object: apply only, no return/close • Cleanup dependency – One object cleanup depend on other objects – Two object cleanup/two method has order dependency
  • 23. Design Issue • AxisConfiguration is a global shared object – Usually only 1 instance even in client side. • Purpose for put service/endpoint map in this global object AxisConfiguration ?
  • 24. Design Issue • Message Dispatch in server side // RequestURIBasedServiceDispatcher public AxisService findService(MessageContext messageContext) throws AxisFault { AxisConfiguration registry = configurationContext.getAxisConfiguration(); AxisService axisService = registry.getService(values[0]); // If the axisService is not null we get the binding that the request came to add // add it as a property to the messageContext if (axisService != null) { Map endpoints = axisService.getEndpoints(); if (endpoints != null) { if (endpoints.size() == 1) { messageContext.setProperty(WSDL2Constants.ENDPOINT_LOCAL_NAME, endpoints.get(axisService.getEndpointName())); } else { String endpointName = values[0].substring(values[0].indexOf(".") + 1); messageContext.setProperty(WSDL2Constants.ENDPOINT_LOCAL_NAME, endpoints.get(endpointName)); } } } return axisService; }
  • 25. Design Issue • Service is ‘singleton’ in server side // AxisConfiguration public AxisService getService(String name) throws AxisFault { AxisService axisService = (AxisService) allServices.get(name); if (axisService != null) { if (axisService.isActive()) { return axisService; } else { throw new AxisFault(Messages .getMessage("serviceinactive", name)); } } else { axisService = (AxisService) allEndpoints.get(name); if (axisService != null) { if (axisService.isActive()) { return axisService; } else { throw new AxisFault(Messages .getMessage("serviceinactive", name)); } } } return null; }
  • 26. Design Issue • Client side – (Usually) New instance every method invocation – No need for message routing • Why still register in Axi2Configuration ? axisConfig = configContext.getAxisConfiguration(); if (axisService == null) { axisService = createAnonymousService(); } this.axisService = axisService; if (axisConfig.getService(axisService.getName()) == null) { axisService.setClientSide(true); axisConfig.addService(axisService); } else { … } …