Programim dhe zhvillim, javascript, python, php, html

Një mënyrë për të gjurmuar situatën me kujtesën gjatë krijimit dhe shkatërrimit të Prototype-beans në aplikacionin Spring?

Në një pjesë të projektit tonë kemi një numër prototipe-fasulesh. Do të doja të kisha një kuptim të qartë të asaj që po ndodh gjatë ekzekutimit të asaj pjese.

A ka ndonjë mënyrë për të gjurmuar situatën gjatë krijimit të fasuleve prototip, çfarë sasie memorie fillojnë të përdorin dhe për të gjurmuar nëse këto fasule u shkatërruan me sukses?

Më duhet jo vetëm të printoj informacionin në tastierë, por do të doja të shihja situatën aktuale me memorien ose listën e prototipeve të memories ekzistuese.


Përgjigjet:


1

nëse duhet ta bëni në mënyrë programore, provoni me këtë Instrumentimi i ndërfaqes publike

Kjo klasë ofron shërbimet e nevojshme për të instrumentuar kodin e gjuhës programuese Java. Instrumentimi është shtimi i kodeve të bajtit në metoda me qëllim të mbledhjes së të dhënave që do të përdoren nga mjetet. Meqenëse ndryshimet janë thjesht shtesë, këto mjete nuk e modifikojnë gjendjen ose sjelljen e aplikacionit. Shembuj të mjeteve të tilla beninje përfshijnë agjentët e monitorimit, profiluesit, analizuesit e mbulimit dhe regjistrimet e ngjarjeve. Ka dy mënyra për të marrë një shembull të ndërfaqes së Instrumentimit:

Kur një JVM lëshohet në një mënyrë që tregon një klasë agjenti. Në atë rast, një shembull i Instrumentimit i kalon metodës kryesore të klasës së agjentit.

Kur një JVM ofron një mekanizëm për të nisur agjentët diku pasi të jetë nisur JVM. Në atë rast, një shembull i Instrumentimit i kalon metodës agjent kryesor të kodit të agjentit.

shembull Instrumentimi: kërkimi i përdorimit të memories së një objekti Java:

public class MyAgent {
  private static volatile Instrumentation globalInstr;
  public static void premain(String args, Instrumentation inst) {
    globalInstr = inst;
  }
  public static long getObjectSize(Object obj) {
    if (globalInstr == null)
      throw new IllegalStateException("Agent not initted");
    return globalInstr.getObjectSize(obj);
  }
}
13.06.2017
  • Kjo është diçka e mirë, e kam harruar këtë. Megjithatë, do të isha i kujdesshëm me përdorimin e tij në një aplikacion prodhimi. 13.06.2017
  • @ AnthonyJClink +1) 13.06.2017

  • 2

    Kam gjetur një mënyrë për të shikuar foton aktuale rreth fasuleve të krijuara nga prototipi. Unë përdor profilin falas të memories VisualVM.

    Në skedën Sampler mund të shihni të gjitha rastet e klasave të krijuara, duke përfshirë fasulet e vetme dhe prototip.

    Do të shihni emrat e paketave dhe klasave tuaja. Në këtë rast:

    • prototip është një paketë me fasulet e mia prototip.

    • singleton është një paketë me fasulet e mia singleton.

    • newclasses është një paketë me klasa që kam krijuar nga operatori new.

    Gjithashtu pasi mbledhësi i mbeturinave të pastrojë kujtesën, do të shihni rezultatin këtu.

    fut përshkrimin e imazhit këtu

    14.06.2017

    3

    Çdo profilist standard do t'ju ndihmonte në mbledhjen e të dhënave që kërkoni. Për një pamje të shpejtë dhe të pistë: http://docs.oracle.com/javase/7/docs/technotes/guides/management/jconsole.html

    megjithatë unë mund të ndihmoj të shpjegoj ciklin e jetës së prototipit i cili mund të qartësojë disa nga pyetjet tuaja.

    Në shumicën e zgjidhjeve softuerike ju keni objekte drejtuese të cilat përgjithësisht zbatohen si të vetme, dhe keni objekte të dhënash të instantuara në përgjithësi sipas nevojës.

    Në pranverë, të gjitha fasulet e krijuara shënohen si të vetme dhe menaxhohen brenda pranverës.

    Kur krijoni një prototip fasule, pranvera thjesht kthen një shembull të ri të asaj fasule, megjithatë ajo menaxhon injeksionin e varësisë së asaj fasule.

    so:

    @Bean
    public String importantString(){
        return "Super Important String used throughout the system";
    }
    

    Kur keni nevojë për vargun e rëndësishëm në prototip:

    @Scope("prototype")
    public class MyPrototypeBean{
        @Bean("importantString")
        private String myString;
    
        public String getString(){
          return importantString;
        }
    }
    

    Spring do të ruajë memorien e vargut të rëndësishëm, por aplikacioni juaj tani do të jetë përgjegjës për trajtimin e ciklit të jetës së prototipit si çdo MyObject() i ri.

    public static void main(String[] args){
    
        MyProtoTypeBean myPrototypeBean = context.getBean(MyPrototypeBean.class);
    
        MyProtoTypeBean myPrototypeBean2 = context.getBean(MyPrototypeBean.class);
    
       String importantString = myPrototypeBean.getString();
    
       // each prototoype is reconstructed
       assert myProtoTypeBean != myPrototypeBean2;       
    
       myPrototypeBean = null;
       myPrototypeBean2 = null;
    
      // Since we are now handling the lifecycle of the prototype beans, as soon 
      //as we clear them and set them to null garbage collection will clear the 
      //prototype beans but not the importantString singleton
      //however spring will still have reference to the singleton string
    
      assert importantString == context.getBean("importantString");
    }
    

    Shpresoj se kjo ndihmon!

    13.06.2017
  • Faleminderit. Në fakt unë kam disa njohuri për një cikli jetësor të fasuleve të vetme dhe prototip. Pyetja ime është se si mund të marr saktësisht informacionin ose statistikat e qarta të përdorimit të fasuleve prototip. 13.06.2017
  • Siç u tha, çdo profilist standard do t'ju japë këtë informacion: docs.oracle.com/javase/7/docs/technotes/guides/management/ 13.06.2017
  • Anthony, në një profilues memorie shoh atë mbledhësin e mbeturinave që pastron të gjitha fasulet e prototipit nga kujtesa. A mund të shpjegoni më shumë detaje nëse ka ndonjë arsye për të shkatërruar ato fasule me dorë nga =null siç tregohet në shembullin tuaj. 15.06.2017
  • E bëra manualisht vetëm për demonstrim... nëse do t'i kisha mbajtur dhe do të vazhdoja me kodin... do të ishin në jvm për shkak të integritetit referencial.. kjo ishte për të treguar që singulli i vargut është ende aktiv dhe prototipet janë zhdukur edhe në kontekst. 15.06.2017
  • Anthony, mund të jepni një përgjigje të mirë të detajuar për pyetjen time në lidhje me pastrimin e fasuleve prototip nga kujtesa? stackoverflow.com/questions/44548234/ 17.06.2017
  • @KirillCh Unë iu përgjigja kësaj pyetjeje nëse keni nevojë për ndonjë qartësi, mos ngurroni të kontaktoni 17.06.2017
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..