SlideShare uma empresa Scribd logo
1 de 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 {
          …
      }

       …

Mais conteúdo relacionado

Semelhante a Axis2 client memory leak caused by design issues in AxisConfiguration

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] 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
 
[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] 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
 
(DEV204) Building High-Performance Native Cloud Apps In C++
(DEV204) Building High-Performance Native Cloud Apps In C++(DEV204) Building High-Performance Native Cloud Apps In C++
(DEV204) Building High-Performance Native Cloud Apps In C++Amazon Web Services
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackNelson Glauber Leal
 
Hidden Gems in Swift
Hidden Gems in SwiftHidden Gems in Swift
Hidden Gems in SwiftNetguru
 

Semelhante a Axis2 client memory leak caused by design issues in AxisConfiguration (20)

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] 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
 
[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] 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
 
(DEV204) Building High-Performance Native Cloud Apps In C++
(DEV204) Building High-Performance Native Cloud Apps In C++(DEV204) Building High-Performance Native Cloud Apps In C++
(DEV204) Building High-Performance Native Cloud Apps In C++
 
Celery with python
Celery with pythonCelery with python
Celery with python
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & Jetpack
 
Hidden Gems in Swift
Hidden Gems in SwiftHidden Gems in Swift
Hidden Gems in Swift
 

Mais 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
 

Mais 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
 

Último

The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 

Último (20)

The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 

Axis2 client memory leak caused by design issues in AxisConfiguration

  • 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 { … } …