https://shipilev.net/

Submitted URL:
https://shipilev.net/
Report Finished:

The outgoing links identified from the page

LinkText
https://twitter.com/shipilev@shipilev
https://hachyderm.io/@shipilev@[email protected]
https://fosstodon.org/@shipilev@[email protected]
https://t.me/shipilev@shipilev
https://t.me/+M4Vg-4vkaBU1ZjEyBackup Telegram channel (in case social networks fail completely)
https://hub.docker.com/r/shipilev/Docker Hub
https://bugs.openjdk.java.net/browse/JDK-8050147JDK-8050147
http://habrahabr.ru/post/133399/1
http://habrahabr.ru/post/119820/2
https://player.vimeo.com/video/289626122Video (Vimeo)

JavaScript Variables · 3 found

Global JavaScript variables loaded on the window object of a page, are variables declared outside of functions and accessible from anywhere in the code within the current scope

NameType
onbeforetoggleobject
documentPictureInPictureobject
onscrollendobject

Console log messages · 0 found

Messages logged to the web console

HTML

The raw HTML body of the page

<!--Логин в Метрике--><html><head>
    <meta name="yandex-verification" content="c996e712e97a8a12">
    <meta content="text/html; charset=utf-8" http-equiv="content-type">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="">
<link href="https://fonts.googleapis.com/css2?family=Merriweather&amp;display=swap" rel="stylesheet"> 
    <meta name="”twitter:site”" content="”@shipilev”">
    <style type="text/css">
		h1 { font-family: 'Merriweather', serif; font-size: 26pt; }
		h2 { font-family: 'Merriweather', serif; font-size: 24pt; }
		h3 { font-family: 'Merriweather', serif; font-size: 22pt; }
		p { font-family: 'Merriweather', serif;  }
		td { font-family: 'Merriweather', serif;  }
		.talkTitle    { font-size: 18pt; font-weight: bold }
    .subtalkTitle { font-size: 16pt; font-weight: bold }
		.subSpan { font-size: 10pt; padding-left: 10pt }
		.subSpan2 { font-size: 8pt; padding-left: 8pt }
    hr { margin-top: 30px; margin-bottom: 30px; }
	</style>
    <title>Aleksey Shipilëv: one-stop page</title>
  </head>
  <body>
    <table width="900" align="center">
      <tbody>
        <tr>
          <td>
            <h1>Aleksey Shipilëv: One Stop Page</h1>

            <h3>Quick Bio</h3>
            <p>Or, "the text I keep copypasting around conferences", therefore written in third person.</p>
            <p>If you want to see me bragging about myself in more detail, <a href="Aleksey_Shipilev_CV.pdf">look at my CV</a>.</p>

            <table cellpadding="5">
              <tbody><tr valign="top">
                <td>
                  <a href="avatars/amzn.jpg"><img src="avatars/amzn-small.jpg"></a>
                  <br>
            	  <p>(This picture can be used as conference avatar, click for larger version)</p>
                </td>
                <td>

            <p>
              <img src="web/flags/gb.png"> (ENG)
              Aleksey is working on Java performance for 15+ years. Today he is employed
              by AWS, where he does OpenJDK development and performance work.
              Aleksey develops and maintains a number of OpenJDK subprojects, including JMH, JOL, and JCStress. He is also an
              active participant in expert groups and communities dealing with performance
              and concurrency. Prior joining AWS, Aleksey was
              working on Apache Harmony at Intel, then moved to Sun Microsystems/Oracle, and then to Red Hat.
            </p>

            <p>
              <img src="web/flags/ru.png"> (RUS)
              Алексей работает над производительностью Java больше 15 лет. Сегодня он работает
              в AWS, где разрабатывает OpenJDK и работает над его производительностью.
              Алексей разрабатывает и поддерживает несколько под-проектов в OpenJDK, включая JMH, JOL, и JCStress. Алексей также
              активно участвует в экспертных группах и сообществах, работающих над вопросами
              производительности и многопоточности. Перед тем как перейти в AWS, Алексей
              работал над Apache Harmony в Intel, а затем перешёл в Sun Microsystems/Oracle, и позднее в Red Hat.
            </p>

                </td>
              </tr>
            </tbody></table>

            <a name="contact">
            </a><a name="email">            
            <h3>Email</h3>

            </a><p><a name="email"> I usually respond to interesting questions over </a><a href="mailto:[email protected]">personal email</a>.
                Note that my personal email is <b>not a support channel</b> for either JDK or any related work; use proper
                project-specific channels for support requests.
	    </p>

            <a name="social">
	    <h3>Social Networks</h3>

	    <p>
	    	Twitter (slowly dying):
	    		</p></a><ul><a name="social">
	    		 	</a><li><a name="social"></a><a href="https://twitter.com/shipilev">@shipilev</a>
	    		</li></ul>
	    <p></p>
	    	
	    <p>
	    	Mastodon (I have not yet decided which one I am going to use most of the time. Consider following all of them, some would naturally go away):
	    		</p><ul>
				<li><a rel="me" href="https://hachyderm.io/@shipilev">@[email protected]</a>
			    	</li><li><a rel="me" href="https://fosstodon.org/@shipilev">@[email protected]</a>
			</li></ul>
	    <p></p>
	    
	    <p>
	    	Telegram:
	    		</p><ul>
	    			<li><a href="https://t.me/shipilev">@shipilev</a>
	    		 	</li><li><a href="https://t.me/+M4Vg-4vkaBU1ZjEy">Backup Telegram channel (in case social networks fail completely)</a>
	    		</li></ul>	    	
	    <p></p>
	    
            <p>
		Please do not abuse the direct messages as the replacement for email (see above).
            </p>

            <h3>Binary Builds</h3>

				<p> Some of my personal CI servers publish the binaries, workspace tarballs, and patches for the projects I am interested in.
				You can find those things at <b><a href="https://builds.shipilev.net/">builds.shipilev.net</a></b>. 
				</p>

				<p>
				Additionally, <b><a href="https://hub.docker.com/r/shipilev/">Docker Hub</a></b> contains some of the images built from those binaries.
				For example, this quickly bootstraps Shenandoah GC enabled image:

				</p><p>
				</p><pre>$ docker run -it --rm shipilev/openjdk-shenandoah:8 java -XX:+UseShenandoahGC -version
openjdk version "1.8.0-force"
OpenJDK Runtime Environment (build 1.8.0-force-sobornost-builds.shipilev.net-shenandoah-jdk8-b291-aarch64-jdk8u181-b15)
OpenJDK 64-Bit Server VM (build 25.71-b291-aarch64-jdk8u181-15, mixed mode)
				</pre>
				<p></p>

            <h3>Recent Posts</h3>
            <a name="recent">
              <table cellpadding="5">
                <tbody>
                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="jvm/anatomy-quarks/">JVM Anatomy Quarks</a> (listing)<br>
                      <span class="subSpan"> Recurrent short stories on JVM, performance, benchmarking, concurrency. Updated frequently.
                      </span> </td>
                  </tr>

                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="jvm/test-your-memory/">Please Test Your (Computer) Memory</a><br>
                      <span class="subSpan"> My JVM keeps crashing in GC, must be a GC bug. But it's not?
                      </span> </td>
                 </tr>


                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="labs/network-de/">Home Network Overview</a><br>
                      <span class="subSpan"> Lab notes: home network overview.
                      </span> </td>
                 </tr>

                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="jvm/objects-inside-out/">Java Objects Inside Out</a><br>
                      <span class="subSpan"> Large-ish treatise on how Hotspot deals with internal object layouts, and what it can mean for low-level library developers.<br> </span> </td>
                  </tr>

                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="labs/threadripper-efficiency/">Threadripper Efficiency for OpenJDK builds</a><br>
                      <span class="subSpan"> Lab notes: build server efficiency tuning.
                      </span> </td>
                 </tr>
                 <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="jvm/diy-gc/">Do It Yourself (OpenJDK) Garbage Collector</a><br>
                      <span class="subSpan"> Because why not.<br> </span> </td>
                  </tr>
                 <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="blog/2016/close-encounters-of-jmm-kind/">Close
                        Encounters of The Java Memory Model Kind</a><br>
                      <span class="subSpan"> Horror details about Java Memory
                        Model abuses.<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="blog/2016/arrays-wisdom-ancients/">Arrays
                        of Wisdom of the Ancients</a><br>
                      <span class="subSpan"> Collection.toArray(new T[0]) or
                        Collection.toArray(new T[size]), that's the question.<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="blog/2015/faster-atomic-fu/">Faster
                        Atomic*FieldUpdaters for Everyone</a><br>
                      <span class="subSpan"> Improve A*FU performance with these
                        weird tricks.<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="blog/2015/black-magic-method-dispatch/">The
                        Black Magic of (Java) Method Dispatch</a><br>
                      <span class="subSpan"> Explores how HotSpot deals with
                        Java method calls.<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="blog/2014/safe-public-construction/">Safe
                        Publication and Safe Initialization in Java</a><br>
                      <span class="subSpan"> Explores the "Safe Publication" and
                        "Safe Initialization" idioms.<br>
                      </span> <span class="subSpan"> This post is a translation
                        and an update for a very outdated <a href="blog/archive/safe-publication/">Russian
                          post</a>.<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="blog/2014/on-the-fence-with-dependencies/">On
                        The Fence With Dependencies</a><br>
                      <span class="subSpan"> Explores the better instruction
                        selection from StoreLoad barriers. Recaps the <a href="https://bugs.openjdk.java.net/browse/JDK-8050147">JDK-8050147</a>
                        work.<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="blog/2014/jmm-pragmatics/">Java
                        Memory Model Pragmatics</a><br>
                      <span class="subSpan"> Describes what is actually written
                        in JMM Spec. This is the transcript for <a href="#jmm">"Java
                          Memory Model"</a> talks.<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="blog/2014/java-scala-divided-we-fail/">Java
                        vs. Scala: Divided We Fail</a><br>
                      <span class="subSpan"> Highlights how to analyze
                        bottlenecks in benchmarks; and how to deal with
                        multi-language benchmarks.<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="blog/2014/nanotrusting-nanotime/">Nanotrusting
                        the Nanotime</a><br>
                      <span class="subSpan"> Unfolds why System.nanoTime() is
                        bad for your health.<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="blog/2014/all-accesses-are-atomic/">All
                        Accesses Are Atomic</a><br>
                      <span class="subSpan"> Quantifies the access atomicity
                        costs.<br>
                      </span> <span class="subSpan"> (Work in progress)<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="blog/2014/all-fields-are-final/">All
                        Fields Are Final</a><br>
                      <span class="subSpan"> Quantifies the final fields memory
                        semantics, in the wake of JMM overhaul.<br>
                      </span> <span class="subSpan"> (Work in progress)<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="blog/2014/exceptional-performance/">The
                        Exceptional Performance of Lil' Exception</a><br>
                      <span class="subSpan"> Explores the performance magic
                        behind Java exceptions.<br>
                      </span> <span class="subSpan"> This is an update for two
                        quite outdated Russian posts: <a href="http://habrahabr.ru/post/133399/">1</a>,
                        <a href="http://habrahabr.ru/post/119820/">2</a> <br>
                      </span> <span class="subSpan"> Caution: a long article.<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="blog/2014/heapdump-is-a-lie/">What
                        Heap Dumps Are Lying to You About</a><br>
                      <span class="subSpan"> Rant about HPROF, and how it
                        confuses the offline heapdump tools.<br>
                      </span> <span class="subSpan"> Shameless promotion of
                        Java Object Layout @ OpenJDK<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td>&nbsp;</td>
                    <td> <img src="web/flags/gb.png"> (ENG) <a href="blog/2014/plans/">Plans
                        for 2014</a><br>
                      <span class="subSpan"> Semi-reflection on 2013, and what's
                        going to happen in 2014. </span> </td>
                    <td><br>
                    </td>
                  </tr>
                  <tr valign="top">
                    <td><br>
                    </td>
                    <td><img src="web/flags/ru.png"> (RUS) <a href="blog/archive/settable-future/">SettableFuture&lt;V&gt;:
                        How To Shoot Oneself in the Foot with Spherical Bicycle
                        in the Vacuum</a><br>
                      <span class="subSpan"> (saved from rapidly deteriorating
                        Habrahabr)<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td><br>
                    </td>
                    <td nowrap="nowrap"><img src="web/flags/ru.png"> (RUS) <a href="blog/archive/pgp-wot/">PGP
                        Web of Trust: graphs and basic estimations</a><br>
                      <span class="subSpan"> (saved from rapidly deteriorating
                        Habrahabr)<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td><br>
                    </td>
                    <td nowrap="nowrap"><img src="web/flags/ru.png"> (RUS) <a href="blog/archive/reflection/">Exploring
                        Reflection on HotSpot</a><br>
                      <span class="subSpan"> (saved from rapidly deteriorating
                        Habrahabr)<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td><br>
                    </td>
                    <td nowrap="nowrap"> <img src="web/flags/ru.png"> (RUS) <a href="blog/archive/multiple-dispatch/">Exploring
                        multiple dispatch on HotSpot</a><br>
                      <span class="subSpan"> (saved from rapidly deteriorating
                        Habrahabr)<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td><br>
                    </td>
                    <td nowrap="nowrap"> <img src="web/flags/ru.png"> (RUS) <a href="blog/archive/deduplication/">Estimating
                        compression and deduplication ratios on real data</a><br>
                      <span class="subSpan"> (saved from rapidly deteriorating
                        Habrahabr)<br>
                      </span> </td>
                  </tr>
                  <tr valign="top">
                    <td><br>
                    </td>
                    <td nowrap="nowrap"> <img src="web/flags/ru.png"> (RUS) <a href="blog/archive/visualvm/">VisualVM: monitoring,
                        profiling, and diagnostics for Java applications</a><br>
                      <span class="subSpan"> (saved from rapidly deteriorating
                        Habrahabr)<br>
                      </span> </td>
                  </tr>
                </tbody>
              </table>

              <hr>

              <h3>Public Talks</h3>
              <p>The talks are arranged in themes. Many talks were given over
                multiple years, choose the most recent one. All other versions
                are kept for reference.</p>

<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#shenandoah">#</a> <a name="shenandoah">Shenandoah GC</a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/gb.png"> Bleeding-edge in English</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/gb.png"> (ENG) <a href="talks/jugbb-Sep2019-shenandoah.pdf">Slides</a>
      </p>

      <p>
        Delivered at JUG Berlin-Brandenburg in September 2019. Work in progress.
      </p>
    </td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/gb.png"> Latest in English</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/gb.png"> (ENG) <a href="talks/javazone-Sep2018-shenandoah.pdf">Slides</a>
      </p>

      <p>
        <img src="web/flags/gb.png"> (ENG) <a href="talks/javazone-Sep2018-shenandoah.mp4">Video (cached here)</a><br>
        <img src="web/flags/gb.png"> (ENG) <a href="https://player.vimeo.com/video/289626122">Video (Vimeo)</a>
      </p>

      <p>
        The major problem for large Java applications is G... (wait for it...) C pauses. Large heaps storing lots of live data, the failure to adhere to generational hypothesis, fragmentation due to old objects coming and going, exacerbate the issues even more. OpenJDK GCs managed to solve the first large part of the puzzle, concurrent marking — the ability to estimate the object reachability graph without stopping the application for a long time. Shenandoah is the new low-pause collector that tries to solve the second large part of the puzzle — the ability to move the objects without stopping the application, cutting the GC pauses even more. This talk is the basic introduction in Shenandoah's design choices, important internal details, performance benefits and trade-offs.
      </p>
    </td>
  </tr>
  
  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jpoint-April2017-shenandoah.pdf">Слайды</a>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="https://www.youtube.com/watch?v=CnRtbtis79U">Видео (YouTube) -- быстрее и кратче (конференция)</a><br>
        <img src="web/flags/ru.png"> (RUS) <a href="https://www.youtube.com/watch?v=JBaZ4lK6OBk">Видео (YouTube) -- длиннее и подробнее (JUG)</a>
      </p>

      <p>
        Одна из главных проблем больших Java-приложений — это cбо... рка мусо... ра. Хранение больших куч данных, 
        активно фрагментирующие приложения и прочие выпадающие из гипотезы о поколениях нагрузки приносят ещё больше проблем.
        Промышленные GC давно решили первую большую часть проблемы сборки, concurrent marking — выяснение графа объектов без долгой 
        остановки приложения. Shenandoah — новый сборщик мусора, который пытается решить вторую большую часть головоломки, а именно
        перемещение объектов без остановки приложения, тем самым сбивая паузы ещё больше. Этот доклад об особенностях дизайна и
        реализации Shenandoah, достоинствах, которыми можно гордиться, и недостатках, с которыми приходится мириться.
      </p>
    </td>
  </tr>  

</tbody></table>

<hr>

<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#shenandoah-II">#</a> <a name="shenandoah-II">Shenandoah GC (part II)</a></td>
  </tr>
 
  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/gb.png"> (ENG) <a href="talks/joker-Nov2017-shenandoah-II.pdf">Slides</a>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/joker-Nov2017-shenandoah-II.mp4">Видео (копия)</a><br>
      </p>

      <p>
        После того, как мы разобрались с главными фазами и превратили их в конкурентные, паузы в основном
        стали определяться более короткими, но всё равно зачастую stop-the-world активностями между большими
        конкурентными эпохами. В них придётся заниматься всяким: сканировать GC roots, взаимодействовать с
        языковыми фичами, которые в курсе про существование GC (например, weak references), разбираться с
        проблемами в реализации safepoint-ов, менеджить память и как-то делиться ей с ОС и т.п. Этот доклад
        ныряет в кроличью нору проблем, с которыми вынужден столкнуться низкопаузный GC вроде Shenandoah,
        размышляет, что можно сделать с этими проблемами на уровне JVM, а также над тем, что могут предпринять
        предусмотрительные разработчики низкопаузных Java-систем, зная об этих граблях.
      </p>
    </td>
  </tr>  

</tbody></table>

<hr>


<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#perf-keynote">#</a> <a name="perf-keynote">Performance (Keynote)</a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jpoint-April2017-perf-keynote.pdf">Слайды</a>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="https://www.youtube.com/watch?v=v6tJ3MTnLkc">Видео (YouTube)</a><br>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="https://habrahabr.ru/company/jugru/blog/338732/">Транскрипт</a>
      </p>

      <p>
        Оптимизация производительности бередит умы опытных разработчиков с начала компьютерных времён. В коллективном бессознательном 
        оптимизация — это то, что делает программирование интересным, конференции раскупаемыми, личный послужной лист — золотым.
      </p>
      
      <p>
	В этом обзорном докладе мы поговорим об оптимизации больших/инфраструктурных проектов (к примеру, OpenJDK): общих принципах,
	тенденциях и соотношениях; жизненном цикле проекта и экономике оптимизаций; роли и жизненном цикле тестов производительности;
	типичных ловушках, разногласиях и противоречиях, в которых оказываются оптимизационные задачи в крупных проектах.
      </p>
    </td>
  </tr>
</tbody></table>

<hr>

<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#varhandles">#</a> <a name="varhandles">VarHandles</a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="https://www.youtube.com/watch?v=ESs0bZw8hsA">Видео (YouTube)</a>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jpoint-April2016-varhandles.pdf">Слайды</a>
      </p>

      <p>
        sun.misc.Unsafe уйдёт и МЫ ВСЕ УМРЁМ! В этом докладе мы посмотрим на работы вокруг VarHandles (JEP 193):
        что там за API, как в крупную клетку устроена референсная реализация, какие новые режимы доступа (acquire/release,
        opaque/relaxed, compareAndSet/compareAndExchange) она даёт, и как мы умудряемся её скомпилировать в практически
        голые доступы.
      </p>
      
      <p>
	Кроме того, мы посмотрим на то, какой Unsafe плохой, какие грабли нам подкладывают текущие JDK/JVM, какие хардварные
	проблемы подтачивают красивый гранит реализации. С позитивной стороны мы увидим побочные улучшения в JDK/JVM:
	оптимизации в ByteBuffers, Atomic*FieldUpdaters, и прочие общие кодогенерационные улучшения.
      </p>
    </td>
  </tr>
</tbody></table>

<hr>

<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#jmm-unlearning-experience">#</a> <a name="jmm-unlearning-experience">Java Memory Model, Unlearning Experience</a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/gb.png"> Latest in English</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/gb.png"> (ENG) <a href="talks/geecon-May2018-jmm.mp4">Video (cached)</a><br>
        <img src="web/flags/gb.png"> (ENG) <a href="https://www.youtube.com/watch?v=TK-7GCCDF_I">Video (YouTube)</a>
      </p>
 
      <p>
        <img src="web/flags/gb.png"> (ENG) <a href="talks/geecon-May2018-jmm.pdf">Slides</a>
      </p>

      <p>
This talk is another attempt at explaining the Java Memory Model (JMM). This time we would assume people come
to concurrency world with their preconceptions how the world works, and conjecture that is the major reason
learning the low-level concurrency is hard for them. Therefore, rather than explaining what JMM <b>is</b>,
we would try to see what JMM <b>is not</b>, and this should eliminate a few misconceptions about the Java
concurrency at large. This would be the <b>unlearning</b> experience! The talk would try to build simple
intuitive rules that we can use every day, and would try to outline the proofs one could employ to verify
those rules. We shall also see surprising behaviors that are allowed by JMM, but not by naive (mis)interpretations
of it. Prerequisites: the talk assumes the audience understands basic JMM, at least on the level of 
<a href="blog/2014/jmm-pragmatics/">"JMM Pragmatics"</a>.
Understanding more advanced topics, like the ones discussed in
<a href="blog/2016/close-encounters-of-jmm-kind/">"Close Encounters of The Java Memory Model Kind"</a> would be a plus.
      </p>
    </td>
  </tr>
</tbody></table>

<hr>

<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#jmm-close-encounters">#</a> <a name="jmm-close-encounters">Java Memory Model, Close Encounters</a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="https://www.youtube.com/watch?v=C6b_dFtujKo">Video (YouTube)</a>
      </p>
 
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/joker-Oct2016-jmm-close-encounters.pdf">Слайды</a>
      </p>

      <p>
        Со времён «Прагматики Java Memory Model» прошло больше двух лет. Но даже у изучавших прошлый доклад специалистов
        остались странные предубеждения, не подкреплённые спецификацией. В этом докладе мы попытаемся разобрать и
        развенчать часть этих предубеждений: про всемогущие барьеры, про реордеринги, про недосинхронизацию и другое
        недовелосипедостроение.
      </p>
      
      <p>
	Доклад основан на уже опубликованной статье, и будет включать себя наиболее вкусные примеры. Доклад не будет
	останавливаться на базовых принципах модели и поэтому требует понимания JMM как минимум на уровне «Прагматики JMM».
      </p>
    </td>
  </tr>
</tbody></table>

<hr>

<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#jmm">#</a> <a name="jmm">Java Memory Model Pragmatics</a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jeeconf-May2014-jmm-pragmatics-1.mp4">Видео, часть 1 (копия)</a><br>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jeeconf-May2014-jmm-pragmatics-2.mp4">Видео, часть 2 (копия)</a><br>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="https://www.youtube.com/watch?v=noDnSV7NCtw">Видео, часть 1 (YouTube)</a><br>
        <img src="web/flags/ru.png"> (RUS) <a href="https://www.youtube.com/watch?v=Ky1_5mabd18">Видео, часть 2 (YouTube)</a>
      </p>

      <img src="web/flags/ru.png"> (RUS) <a href="talks/narnia-2555-jmm-pragmatics-ru.pdf">Слайды</a><br>

      <p>
        Спецификация Java Memory Model в JLS пытается быть предельно сжатой и полной. Поскольку JMM пытается объять очень большой пласт явлений, её формализм весьма громоздок, что обернулось потерей понимабельности модели простыми смертными.
      </p>

      <p>
        Понять хотя бы наполовину, что написано в спецификации Java Memory Model (далее — JMM), получается раза с третьего. Понять, почему записано именно так, по спецификации вообще невозможно, и приходится обращаться к дополнительным источникам, которые пытаются как-то формализм JMM переосмыслить, дополнить, и привести примеры.
      </p>

      <p>
        В этом докладе мы попытаемся проследить за логикой построения модели; поговорим о том, каких прагматических результатов модель пыталась добиться; посмотрим, с какими ограничениями злого внешнего мира при этом пришлось столкнуться; увидим, как JMM пытается балансировать между требованиями девелоперов и требованиями разработчиков рантаймов и железа.
      </p>
    </td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/gb.png"> Latest in English</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/gb.png"> (ENG) <a href="https://www.youtube.com/watch?v=TxqsKzxyySo">Video (YouTube)</a><br>
      </p>

      <p>
        <img src="web/flags/gb.png"> (ENG) <a href="talks/narnia-2555-jmm-pragmatics-en.pdf">Slides</a>
      </p>

      <p>
         <img src="web/flags/gb.png"> (ENG) <a href="blog/2014/jmm-pragmatics/">Talk transcript</a>
      </p>

      <p>
        The Java Memory Model is the most complicated part of Java spec that must be understood by at least library and runtime developers. Unfortunately, it is worded in such a way that it takes a few senior guys to decipher it for each other.
      </p>

      <p>
        Most developers, of course, are not using JMM rules as stated, and instead make a few constructions out of its rules, or worse, blindly copy the constructions from senior developers without understanding the limits of their applicability. If you are an ordinary guy who is not into hardcore concurrency, you can pass this talk, and read high-level books, like “Java Concurrency in Practice”. If you are one of the senior folks interested in how all this works, join us!
      </p>

      <p>
        In this talk, we will follow the logic of the model; review what pragmatic results the model was trying to achieve; look closely at the real world limitations the model had to endure; see how JMM tries to balance between developers’ needs and runtime/hardware maintainers requests.
      </p>
    </td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p>Historical (e.g. outdated) materials</p>
    </td>
  </tr>

  <tr colspan="2">
    <td>
      <p>
        <img src="web/flags/us.png"> (ENG) <a href="talks/jvmls-July2014-jmm-pragmatics.pdf">JVMLS 2014: Java Memory Model Pragmatics</a><br>
          <span class="subSpan"> Workshop collaterals. </span>
        <br>
      </p>

      <p>
      <img src="web/flags/ua.png"> (RUS) <a href="talks/jeeconf-May2014-jmm-pragmatics.pdf">
        JEEConf 2014: Java Memory Model Pragmatics</a><br>
        <span class="subSpan">
           Video: <a href="https://jeeconf.com/materials/jmm-pragmatics/">JEEConf</a>,
           <a href="talks/jeeconf-May2014-jmm-pragmatics-1.mp4">Direct: part 1, 364 MB</a>,
           <a href="talks/jeeconf-May2014-jmm-pragmatics-2.mp4">Direct: part 2, 365 MB</a>
        </span>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/codefest-Mar2014-jmm-pragmatics.pdf">
        CodeFest 2014: Java Memory Model Pragmatics</a>
        <span class="subSpan"></span>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jugru-Feb2014-jmm-pragmatics.pdf">
        JUG.Ru 2014: Java Memory Model Pragmatics</a><br>
        <span class="subSpan"> Video: <a href="https://www.youtube.com/watch?v=iB2N8aqwtxc">Youtube</a>,
            <a href="talks/jugru-Feb2014-jmm-pragmatics.mp4">Direct: 1090 MB</a></span>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/j1-April2013-jmm.pdf">
        JavaOne Russia 2013: Java Memory Model</a><br>
        <span class="subSpan"> (hosted for Sergey Kuksenko)</span>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/j1-April2012-jmm.pdf">
          JavaOne Moscow 2012: Java Memory Model</a><br>
        <span class="subSpan"> (hosted for Sergey Kuksenko)<br></span>
        <span class="subSpan"> Video: <a href="https://www.youtube.com/watch?v=QBLKJxURdro">Youtube</a>
      </span></p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/javaday-Oct2011-jmm.pdf">
          JavaDay Kiev 2011: Java Memory Model</a><br>
        <span class="subSpan"> (hosted for Sergey Kuksenko)<br> </span>
      </p>

    </td>
  </tr>
</tbody></table>

<hr>


<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#string-catechism">#</a> <a name="string-catechism"> java.lang.String Catechism</a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/gb.png"> Latest in English</p>
    </td>
  </tr>

    <tr valign="top">
      <td colspan="2">
        <p>
           <img src="web/flags/gb.png"> (ENG) <a href="https://www.youtube.com/watch?v=YgGAUGC9ksk">Video (YouTube)</a><br>
        </p><p>

        </p><p>
          <img src="web/flags/gb.png"> (ENG) <a href="talks/joker-Oct2014-string-catechism.pdf">
            Slides</a>
        </p>

        <p>
          Hardcore enterprise solutions, as well as other products, normally deal with large amount of text data. Those applications spend considerable time and memory to mess with Strings. It had been repeatedly shown that optimizing String usages will almost always give the immediate performance boosts. This is not to mention dodging OutOfMemoryErrors and the like.
        </p>

        <p>
          In this talk, we will revisit the basic sins of working with Strings: gluttony of concatenation, wrath of substrings, greed of interning, pride of deduplication et cetera. We will also see the costs of sloth, believing JVM Almighty will do all the work for us.
        </p>
      </td>
    </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
         <img src="web/flags/ru.png"> (RUS) <a href="https://www.youtube.com/watch?v=SZFe3m1DV1A">Video (YouTube)</a><br>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jpoint-April2015-string-catechism.pdf">
          Слайды</a>
      </p>

      <p>
        В приложениях кровавого энтерпрайза и прочих продуктах, что так или иначе связаны с обработкой текстовых данных, порядочное количество памяти и времени тратится на возню со строками. Оптимизации работы со строками часто дают немедленный выигрыш, а то и уворачивание от OutOfMemoryError.
      </p>

      <p>
        В этом докладе будут рассмотрены основные пороки работы со строками: чревоугодие конкатенации, блуд подстрок, корыстолюбие интернирования, гордыню дедупликации и прочее. Кроме того, речь пойдет о том, чего стоит излишняя надежда на JDK и JVM.
      </p>
    </td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p>Historical (e.g. outdated) materials</p>
    </td>
  </tr>

  <tr>
    <td>
      <p>None yet!</p>
    </td>
  </tr>
</tbody></table>

<hr>


<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#lord-of-the-strings">#</a> <a name="lord-of-the-strings">The Lord Of The Strings</a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/gb.png"> Latest in English</p>
    </td>
  </tr>

    <tr valign="top">
      <td colspan="2">
        <p>
           <img src="web/flags/gb.png"> (ENG) <a href="https://www.youtube.com/watch?v=wIyeOaitmWM">Video (YouTube)</a><br>
        </p>

        <p>
           <img src="web/flags/gb.png"> (ENG) <a href="talks/jfokus-Feb2016-lord-of-the-strings.pdf">Slides</a>
        </p>

        <p>
          java.lang.String is pervasively and perversely used in most Java applications. Not surprisingly, we are looking into optimizing it both on small and large scale.
        </p>

        <p>
          In this talk, we will take a deeper look into two interesting String-related features coming in JDK 9: a)
          <a href="http://openjdk.java.net/jeps/254">Compact Strings</a>, that saves memory for Strings representable with single-byte chars, with little or none performance regressions, and in many cases, significant performance improvements; b) <a href="http://openjdk.java.net/jeps/280">Indify String Concat</a>, that uses the magic of invokedynamic to concatenate Strings, to free runtime implementors for optimizing string concatenation without pushing users to recompile their programs.
        </p>

        <p>
          We will talk about the rationale, pitfalls and caveats of implementing the intrusive core library/runtime changes.
        </p>
      </td>
    </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td>
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="https://www.youtube.com/watch?v=HWkVJkoo1_Q">Видео (YouTube)</a><br>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jbreak-Mar2016-lord-of-the-strings.pdf">Слайды</a>
      </p>

      <p>
        java.lang.String — один из наиболее часто используемых классов в Java приложениях. Не удивительно, что мы пытаемся его улучшать и микро- и макро-оптимизациями. В докладе будут освещены вопросы рациональности, подходов к реализации, практических граблей, с которыми сталкиваются разработчики JDK, пытающиеся ничего не сломать в огромной экосистеме, а также чем эта подковёрная деятельность грозит простым пользователям.
      </p>

      <p>
        В этом докладе мы посмотрим на две грядущие фичи в JDK 9, направленные на оптимизацию строк:
        <a href="http://openjdk.java.net/jeps/254">Compact Strings</a>, сжимающие строки с однобайтовыми символами, что улучшает футпринт и даже общую производительность; и <a href="http://openjdk.java.net/jeps/280">Indify String Concat</a>, использующий магию invokedynamic для конкатенации строк, позволяющий подкручивать реализацию конкатенации без рекомпиляции программ.
      </p>

    </td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p>Historical (e.g. outdated) materials</p>
    </td>
  </tr>

  <tr>
    <td>
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jpoint-April2016-lord-of-the-strings.pdf">
          JPoint 2016: The Lord of the Strings</a><br>
      </p>
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/joker-Oct2015-lord-of-the-strings.pdfjoker-Oct2015-lord-of-the-strings.pdf">
          Joker 2015: The Lord of the Strings</a><br>
      </p>
    </td>
  </tr>
</tbody></table>

<hr>


<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#compress-me">#</a> <a name="compress-me"> Compress Me Tightly</a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="https://www.youtube.com/watch?v=hOF7sewi6pk">Видео (YouTube)</a><br>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jbreak-Mar2016-compress-me.pdf">
          Слайды</a>
      </p>

      <p>
        Контроль над использованием памяти — это ключ к написанию высокопроизводительного софта. В этом докладе мы покопаемся в кишках JVM и JDK, в поисках того, как сама платформа пытается сэкономить на памяти. Посмотрим на упаковку заголовков и полей объектов, сжатие указателей, учёт ссылок между поколениями в куче, трюки в сгенерированном коде, кэш автобоксинга и т. п. Всё это обильно сдобрим описанием возможных граблей и измерениями производительности.
      </p>

    </td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p>Historical (e.g. outdated) materials</p>
    </td>
  </tr>

  <tr>
    <td>
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jpoint-April2015-compress-me.pdf">
          JPoint 2015: Compress Me Tightly</a>
      </p>
    </td>
  </tr>
</tbody></table>

<hr>


<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#performance-101">#</a> <a name="performance-101">Performance Optimization 101 </a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/gb.png"> Latest in English</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/gb.png"> (ENG) <a href="talks/devoxx-Nov2012-perfMethodology.mp4">Video (cached copy)</a><br>
      </p>
 
      <p>
        <img src="web/flags/be.png"> (ENG) <a href="talks/devoxx-Nov2012-perfMethodology.pdf">Slides</a>
      </p>

      <p>
        <a href="talks/devoxx-Nov2012-perfMethodology-mindmap.pdf">Talk Mindmap</a>
      </p>

      <p>Performance optimization has always thought to be a fine art as it could not be easily formalized, or constrained into one solid workflow. However, there are common patterns all performance engineers could follow in their investigations. This session describes some approaches and tools to analyise modern application performance problems in J2SE and hardware.</p>
    </td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td>
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="https://www.youtube.com/watch?v=vF0lNnKCQM8">Видео (YouTube)</a><br>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jeeconf-May2012-perfMethodology.pdf">Слайды</a>
      </p>

      <p>Хотите сделать ваше приложение быстрее, и для этого оптимизируете Java-код? Мы не будем рассказывать, как оптимизировать Java-программы. Мы не будем рассказывать, как использовать ваш любимый профайлер. В первой части мы расскажем, как делать «правильные вещи» (TM), а не тратить две недели на бесполезные приседания; эти вещи не всегда лежат в самом приложении. Во второй части мы рассмотрим то же самое, применительно к случаю многоядерных машин, разберём типичные казусы с производительностью программ, работающих на больших машинах; опишем их симптомы, а также обсудим типичные подходы к диагностике проблем и их классические решения.
      </p>
    </td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p>Historical (e.g. outdated) materials</p>
    </td>
  </tr>

  <tr>
    <td colspan="2">
      <p>
         <img src="web/flags/ru.png"> (RUS) <a href="talks/jugru-June2012-perfMethodology.mp4">
           JUG.Ru 2012 Video, 451 MB</a> 
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/j1-April2012-dragons.pdf">JavaOne Moscow
                                2012: How To Train Your Dragon: Attack The Scaling on
                                Multicore Machines</a><br>
          <span class="subSpan"><a href="https://www.youtube.com/watch?v=C67AAFtIvw8">Youtube video</a></span>
      </p>

      <p>
         <img src="web/flags/ru.png"> (RUS) <a href="talks/j1-April2012-methodology.pdf">
           JavaOne Moscow 2012: Performance Methodology Intro</a><br>
              <span class="subSpan"><a href="https://www.youtube.com/watch?v=bmPlkwlmR88">Youtube video</a></span>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/javaday-Feb2012-perfMethodology.pdf">
          JavaDay SPB 2012: Performance Methodology Intro</a><br>
      </p>
   </td>
  </tr>
</tbody></table>

<hr>

<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#benchmarking">#</a> <a name="benchmarking"> Benchmarking ("Two Timestamps" Story)</a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/gb.png"> Latest in English</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/gb.png"> (ENG) <a href="talks/jvmls-July2014-benchmarking.mp4">Video (cached copy)</a><br>
      </p>

      <p>
        <img src="web/flags/gb.png"> (ENG) <a href="talks/jvmls-July2014-benchmarking.pdf">Slides</a>
      </p>

      <p>
        This talk includes short versions of <a href="blog/2014/nanotrusting-nanotime/">"Nanotrusting the Nanotime"</a>
        and <a href="blog/2014/java-scala-divided-we-fail/">"Java vs. Scala: Divided We Fail"</a> posts.
      </p>

      <p>
        Performance measurement is easy! Get System.nanoTime() once, get it twice, substract, multiply, divide, stare at the numbers and go for optimizations. Nope! In this talk, we will see how does one uses benchmarks to measure the application performance, what mistakes are usually done in the course of that work, how to avoid those mistakes, and all-in-all how to get any sensible data from the world where everything depends on everything.
      </p>

      <p>
        We will use Java Microbenchmark Harness (JMH), the standard harness in OpenJDK, in our tutorials.
      </p>

    </td>
  </tr>



  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="https://www.youtube.com/watch?v=8pMfUopQ9Es">Видео (YouTube)</a><br>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/joker-Oct2014-benchmarking.pdf">Слайды</a>
      </p>

      <p>Хотите сделать ваше приложение быстрее, и для этого оптимизируете Java-код? Мы не будем рассказывать, как оптимизировать Java-программы. Мы не будем рассказывать, как использовать ваш любимый профайлер. В первой части мы расскажем, как делать «правильные вещи» (TM), а не тратить две недели на бесполезные приседания; эти вещи не всегда лежат в самом приложении. Во второй части мы рассмотрим то же самое, применительно к случаю многоядерных машин, разберём типичные казусы с производительностью программ, работающих на больших машинах; опишем их симптомы, а также обсудим типичные подходы к диагностике проблем и их классические решения.
      </p>
    </td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p>Historical (e.g. outdated) materials</p>
    </td>
  </tr>

  <tr>
    <td colspan="2">
      <p>
        <img src="web/flags/ua.png"> (RUS) <a href="talks/jeeconf-May2014-benchmarking.pdf">
          JEEConf 2014: Java Benchmarking, Timestamping Failures</a><br>
          <span class="subSpan"> Video: <a href="http://jeeconf.com/materials/benchmarking/">JEEConf</a>,
            <a href="talks/jeeconf-May2014-benchmarking.mp4">Direct: 351 MB</a> </span>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jpoint-April2014-benchmarking.pdf">
          JPoint 2014: Java Benchmarking, Timestamping Failures</a><br>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/codefest-Mar2014-benchmarking.pdf">
          CodeFest 2014: Java Benchmarking</a><br>
      </p>

   </td>
  </tr>

</tbody></table>

<hr>

<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#benchmarking-1">#</a> <a name="benchmarking"> Benchmarking ("The Lesser of Two Evils" Story)</a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/gb.png"> Latest in English</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/gb.png"> (ENG) <a href="https://www.youtube.com/watch?v=VaWgOCDBxYw">Video (YouTube)</a><br>
      </p>

      <p>
        <img src="web/flags/gb.png"> (ENG) <a href="talks/devoxx-Nov2013-benchmarking.pdf">Slides</a>
      </p>

      <p>
        Measuring the performance is the fine art, and measuring the performance on microbenchmarks is double so. There are multiple caveats one should take a great care of while designing the experiment involving microbenchmarks. The advanced experience with VM technology is required, the exposure with particular nits on exact VM is also a plus.
      </p>

      <p>
        Some say the benchmarking is inherently evil. We agree with that assertion, but also realize the benchmarking is nevertheless essential, and we need to learn how to benchmark without shooting ourselves in the foot all the time. In this session, we take the crash course in fine microbenchmarking, and introducing OpenJDK's Java Microbenchmark Harness (JMH) along the way.
      </p>

    </td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="https://www.youtube.com/watch?v=Mw0Vimj39cI">Видео (YouTube)</a><br>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/j1-April2013-benchmarking-II.pdf">Слайды</a>
      </p>

      <p>
        Доклад про построение корректных (микро)бенчмарков для JVM, учитывая всевозможные грабли, которые нас поджидают от автоматических оптимизаций, особенностей работы рантайма, случайной игры в кости богоподобных существ и прочих жизненных неприятностей. Доклад расширяет и углубляет первый доклад про микробенчмарки, читавшийся в 2009 году. Примеры микробенчмарков показаны на примере JMH — фреймворка, использующегося для тестирования OpenJDK.
      </p>
    </td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p>Historical (e.g. outdated) materials</p>
    </td>
  </tr>

  <tr>
    <td>

    <p>
      <img src="web/flags/se.png"> (ENG) <a href="talks/oredev-Nov2013-benchmarking.pdf">
        Oredev 2013: (The Art of) (Java) Benchmarking</a><br>
        <span class="subSpan"> Video: <a href="http://vimeo.com/78900556">Vimeo</a>,
          <a href="talks/oredev-Nov2013-benchmarking.mp4">Direct: 188 MB</a>
        </span>
    </p>

    <p>
      <img src="web/flags/us.png"> (ENG) <a href="talks/jvmls-July2013-benchmarking.pdf">
        JVMLS 2013: JVM Benchmarking</a><br>
        <span class="subSpan">
          Video: <a href="http://medianetwork.oracle.com/video/player/2630310904001">OTN</a>,
          <a href="talks/jvmls-July2013-benchmarking.mp4">Direct: 968 MB</a>
        </span>
    </p>

    <p>
      <img src="web/flags/us.png"> (ENG) <a href="talks/j1-Oct2011-21682-benchmarking.pdf">
        JavaOne SF 2011: (The Art of) (Java) Benchmarking</a>
    </p>

    <p>
      <img src="web/flags/ua.png"> (RUS) <a href="talks/javaday-Oct2011-benchmarking.pdf">
        JavaDay Kiev 2011: (The Art of) (Java) Benchmarking</a>
    </p>

    <p>
      <img src="web/flags/ru.png"> (RUS) <a href="talks/j1-April2011-benchmarking.pdf">
        JavaOne Moscow 2011: (The Art of) (Java) Benchmarking</a>
    </p>
  </td>
  </tr>
</tbody></table>

<hr>



<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#jcstress">#</a> <a name="jcstress"> Java Concurrency Stress Tests</a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/gb.png"> Latest in English</p>
    </td>
  </tr>

    <tr valign="top">
      <td colspan="2">
	<p>
        	No video.
	</p>

        <p>
          <img src="web/flags/us.png"> (ENG) <a href="talks/jvmls-July2013-jcstress.pdf">JVMLS 2013:
              Breaking Concurrency Bad, or jcstress</a>
        </p>

        <p>
          A very short lightning talk.
        </p>
      </td>
    </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
	<p>
	   <img src="web/flags/ru.png"> (RUS) <a href="talks/jpoint-April2013-bp-concurrency.mp4">Видео (копия)</a>
	</p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/narnia-2555-concurrency.pdf">Слайды</a>
      </p>

      <p>
        Доклад про опыт тестирования concurrency в JDK/JVM, разного рода загадки и примеры как оптимизации и дефекты в реализации виртуальной машины и библиотек ломают модель памяти, и что нам с этим делать. Доклад *требует* знания JMM, понимания внутренней работы JRE, и устройства железа.
      </p>
    </td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p>Historical (e.g. outdated) materials</p>
    </td>
  </tr>

  <tr>
    <td>

      <p>
        <img src="web/flags/ua.png"> (RUS) <a href="talks/jeeconf-May2013-concurrency.pdf">
          JEEConf 2013: Java Concurrency, Battle for Correctness</a><br>
          <span class="subSpan"> Video:
            <a href="https://jeeconf.com/materials/java-concurrency/">JEEConf</a>,
            <a href="talks/jeeconf-May2013-concurrency.mp4">Direct: 414 MB</a>
          </span>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/j1-April2013-bp-concurrency.pdf">
          JavaOne Russia 2013: Bullet-Proof Java Concurrency</a><br>
          <span class="subSpan"> Video (courtesy of JPoint):
            <a href="https://www.youtube.com/watch?v=8lHAcetqQ5c">YouTube</a>,
            <a href="talks/jpoint-April2013-bp-concurrency.mp4">Direct: 431 MB</a>
          </span>
      </p>

  </td>
  </tr>
</tbody></table>

<hr>


<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#forkjoin">#</a> <a name="forkjoin"> Fork/Join</a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jugru-July2013-forkjoin.mp4">Видео (копия)</a><br>
        <img src="web/flags/ru.png"> (RUS) <a href="https://www.youtube.com/watch?v=t0dGLFtRR9c">Видео (YouTube)</a>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jeeconf-May2013-forkjoin.pdf">Слайды</a>
      </p>

      <p>
        В JDK 7 появилась поддержка параллельных операций, ложащихся в модель Fork/Join. Этот доклад рассматривает особенности реализации ForkJoinPool, явные ограничения и подводные камни, а также следующие из них правильные и неправильные модели использования новой функциональности.
      </p>
    </td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p>Historical (e.g. outdated) materials</p>
    </td>
  </tr>

  <tr>
    <td>

      <p>
        <img src="web/flags/ua.png"> (RUS) <a href="talks/jeeconf-May2013-forkjoin.pdf">
          JEEConf 2013: Fork/Join</a><br>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jeeconf-May2013-forkjoin.pdf">
          JUG.Ru (Spb): Fork/Join</a><br>
         <span class="subSpan"> Video:
           <a href="https://www.youtube.com/watch?v=t0dGLFtRR9c">YouTube</a>,
           <a href="talks/jugru-July2013-forkjoin.mp4">Direct: 889 MB</a> </span>
      </p>

      <p>
        <img src="web/flags/ua.png"> (RUS) <a href="talks/jeeconf-May2012-forkjoin.pdf">
          JEEConf 2012: Fork/Join</a><br>
          <span class="subSpan"> Video:
            <a href="http://video.yandex.ru/users/xpinjection/view/183#hq">Yandex</a>
          </span>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/j1-April2012-forkjoin.pdf">
          JavaOne Moscow 2012: Fork/Join</a><br>
          <span class="subSpan"> Video:
            <a href="https://www.youtube.com/watch?v=Z1DDBu7K77Q">Youtube</a>
          </span>
      </p>

  </td>
  </tr>
</tbody></table>

<hr>


<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#object-layout">#</a> <a name="object-layout"> Java Object Layout</a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="jeeconf-May2014-hprof-is-a-lie.mp4">Видео (копия)</a><br>
      </p>
 
     <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jeeconf-May2014-hprof-is-a-lie.pdf">
          Слайды</a>
      </p>

      <p>
        <a href="http://openjdk.java.net/projects/code-tools/jol/">JOL</a>
      </p>

      <p>
        <a href="http://hg.openjdk.java.net/code-tools/jol/file/tip/jol-samples/src/main/java/org/openjdk/jol/samples/">JOL
          Samples</a> 
      </p>

      <p>
        Программисты — как дети, всегда пытаются разломать свои любимые игрушки, чтобы понять, как же те работают. Некоторым детям, правда, действительно нужно знать, сколько лишних деталек напихали туда глупые конструкторы. Для возмужавших детей — этот доклад.
      </p>

      <p>
        Возмужавшие дети (tm) обычно берут в руки heap dump и начинают ковыряться в нём отвёрточкой. Но heap dump — это так же надёжно, как информация, выбитая из пленного партизана. Он «сдаст» вам координаты аэродрома с кукурузниками, а найдёте вы там пустое кукурузное поле.
      </p>

      <p>
        Нам нужно взять объекты тёпленькими прямо в рабочей JVM, где они живут своей подпольной жизнью. Только так мы сможем в деталях рассмотреть, как разложены поля, как разложены объекты в памяти, как их связи влияют на укладку, как и когда они меняют места дислокации, пуская пыль в глаза честным разработчикам.
      </p>

      <p>
        Очная ставка с захваченными за линией фронта объектами гарантируется!
      </p>
    </td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p>Historical (e.g. outdated) materials</p>
    </td>
  </tr>

  <tr>
    <td>
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/joker-Oct2013-hprof-is-a-lie.pdf">
          Joker 2013: What Heap Dumps Are Lying To You About</a><br>
          <span class="subSpan">Video:
            <a href="https://www.youtube.com/watch?v=r_bnfv-nlcs">Youtube</a>,
            <a href="talks/joker-Oct2013-hprof-is-a-lie.mp4">Direct: 497 MB</a> </span><br>
          <span class="subSpan">Collaterals: <a href="http://openjdk.java.net/projects/code-tools/jol/">JOL</a>,
            <a href="http://hg.openjdk.java.net/code-tools/jol/file/tip/jol-samples/src/main/java/org/openjdk/jol/samples/">JOL
              Samples</a> </span>
      </p>
  </td></tr>

</tbody></table>

<hr>

<table cellpadding="5">
  <tbody><tr class="talkTitle">
    <td colspan="2"><a href="#lambdas">#</a> <a name="lambdas"> JDK 8, Lambdas</a></td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p><img src="web/flags/ru.png"> Latest in Russian</p>
    </td>
  </tr>

  <tr valign="top">
    <td colspan="2">
      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jugru-Oct2012-lambdas-2.mp4">Видео, часть 1 (копия)</a><br>
        <img src="web/flags/ru.png"> (RUS) <a href="talks/jugru-Oct2012-lambdas-2.mp4">Видео, часть 2 (копия)</a><br>
      </p>

      <p>
        <img src="web/flags/ru.png"> (RUS) <a href="https://github.com/shipilev/jdk8-lambda-samples">
          JUG.Ru (SPb): Per Aspera Ad Lambdas</a>
      </p>

      <p>
        Самым существенным со времен Java 5 изменением языка станет поддержка лямбда-выражений в Java 8. Эта встреча посвящена техническим аспектам Project Lambda, рассказу о ситуации «изнутри».
      </p>

      <p>
        Речь пойдёт:

      </p><ol>
        <li> Про лямбды: что такое лямбды в контексте Java; как они соотносятся с существующими примитивами языка; лямбды — сахар или нет; как jsr292 победил javac; сколько, где, и кому стоят лямбды; плюшки, грабли, и прочие особенности;
        </li><li> Про stream (bulk) операции: что это такое, и с чем их едят; при чём тут Fork/Join; сколько и где стоит их использование; пышки, шишки, и прочие характерные свойства;
        </li><li> Про defender (default) методы: что это такое, зачем нужны; чем всё-таки отличается абстрактный класс от интерфейса; прочие весёлые неурядицы
      </li></ol>
      <p></p>
    </td>
  </tr>

  <tr class="subtalkTitle" valign="top">
    <td colspan="2">
      <p>Historical (e.g. <i>may be</i> outdated) materials</p>
    </td>
  </tr>

  <tr>
    <td>
    <p>
      <img src="web/flags/lv.png"> (ENG) <a href="talks/javaday-Nov2013-streamstyle.pdf">
        JavaDay Riga 2013: JDK 8: Stream Style</a><br>
        <span class="subSpan">(hosted for Sergey Kuksenko)</span>
    </p>

    <p>
      <img src="web/flags/ua.png"> (RUS) <a href="talks/jeeconf-May2013-lambda-malleus.pdf">
        JEEConf 2013: JDK 8: Lambda Malleus</a><br>
        <span class="subSpan">(modified by Sergey Kuksenko)</span>
    </p>

    <p>
      <img src="web/flags/ru.png"> (RUS) <a href="talks/j1-April2013-lambda-malleus.pdf">
        JavaOne Russia 2013, JDK 8: Lambda Malleus</a>
    </p>

    <p>
      <img src="web/flags/ua.png"> (RUS) <a href="talks/jeeconf-May2013-lambda-I.pdf">
        JEEConf 2013: JDK 8: I, Lambda</a><br>
        <span class="subSpan">(hosted for Sergey Kuksenko)</span>
    </p>

    <p>
      <img src="web/flags/ru.png"> (RUS) <a href="talks/j1-April2013-lambda-I.pdf">
        JavaOne Russia 2013, JDK 8: I, Lambda</a><br>
        <span class="subSpan"> (hosted for Sergey Kuksenko)</span>
    </p>

  </td>
  </tr>
</tbody></table>

<hr>

</a><p class="talkTitle"><a name="recent">
  </a><a href="#quantum-perf">#</a> <a name="quantum-perf">Quantum Performance Effects </a>
</p>

<p>
  <img src="web/flags/lv.png"> (ENG) <a href="talks/javaday-Nov2013-quantum-performance.pdf">
    JavaDay Riga 2013: "Quantum" Performance Effects</a><br>
    <span class="subSpan"> (hosted for Sergey Kuksenko)</span>
</p>

<p>
 <img src="web/flags/ru.png"> (RUS) <a href="talks/j1-April2013-quantum-performance.pdf">
   JavaOne Russia 2013: "Quantum" Performance Effects</a><br>
    <span class="subSpan"> (hosted for Sergey Kuksenko)<br></span>
    <span class="subSpan"> Video (courtesy of JPoint):
      <a href="http://www.youtube.com/watch?v=KVXy-bdHnQU">YouTube</a>,
      <a href="talks/jpoint-April2013-quantum-performance.mp4">high quality</a> (514 MB) </span>
</p>

<hr>

<p class="talkTitle">
  <a href="#performance-bof">#</a> <a name="performance-bof"> Java Platform Performance BOF </a>
</p>

<p>
  <img src="web/flags/ua.png"> (RUS) <a href="talks/jeeconf-May2011-performanceBoF.pdf">
    JEEConf 2011: Java Platform Performance BoF</a>
</p>

<p>
  <img src="web/flags/ru.png"> (RUS) <a href="talks/j1-April2011-performanceBoF.pdf">
    JavaOne Moscow 2011: Java Platform Performance BoF</a>
</p>

<p>
  <img src="web/flags/ru.png"> (RUS) <a href="talks/javatechday-Feb2011-performanceBoF.pdf">
    JavaTechDay SPB, 2011: Java Platform Performance BoF</a>
</p>

<hr>

<p class="talkTitle">
  <a href="#assorted">#</a><a name="assorted"> Assorted </a>
</p>

<p>
  <img src="web/flags/us.png"> (ENG) <a href="talks/jvmls-July2013-contended.pdf">
    JVMLS 2013: False Sharing, and @Contended</a><br>
</p>

<p>
  <img src="web/flags/us.png"> (ENG) <a href="talks/j1-Oct2011-24029-javacpp.pdf">
    JavaOne SF 2011: Java or C++, Practical Advice You Can Use</a><br>
    <span class="subSpan"> (co-presenter with Sergey Kuksenko and Charlie Hunt)<br></span>
    <span class="subSpan"> Video: <a href="http://parleys.com/#st=5&amp;id=3021">Parleys</a></span>
</p>

<!--
      <video width="560" height="315" controls preload="none" poster="video-placeholder-315.jpg">
        <source src="talks/jugru-Oct2012-lambdas-1.mp4" type="video/mp4">
      </video> -->

<hr>

              <h3>Papers</h3>
              <table cellpadding="5">
                <tbody>
                  <tr valign="top">
                    <td><br>
                    </td>
                    <td nowrap="nowrap"> <img src="web/flags/us.png"> (ENG) <a href="papers/icpe-wip08-shipilev.pdf">SPECjbb2012:
                        Updated Metrics for a Business Benchmark</a> @ ACM/ICPE,
                      Boston, April 22-25, USA </td>
                  </tr>
                </tbody>
              </table>
              <h3>Projects</h3>
            
            <blockquote><a name="recent"> </a>
              <p><a name="recent"></a><b><a href="http://harmony.apache.org/">Apache
                    Harmony</a></b><br>
                &nbsp;&nbsp; Open-source implementation of Java 5 under APLv2. <br>
                &nbsp;&nbsp; Parts of Harmony's class libraries are now parts of
                Android. <br>
                &nbsp;&nbsp; Retired.</p>
              <p><b><a href="http://openjdk.java.net/">OpenJDK</a></b><br>
                &nbsp;&nbsp; Open-source, Oracle-endorsed implementation of Java
                8 under GPLv2 with CP exception. <br>
                &nbsp;&nbsp; The most used Java runtime in the world.</p>
              <p><b><a href="http://openjdk.java.net/projects/code-tools/jmh/">Java
                    Microbenchmark Harness (jmh)</a></b><br>
                &nbsp;&nbsp; The microbenchmark harness used to drive most of
                our performance experiments.</p>
              <p><b><a href="http://openjdk.java.net/projects/code-tools/jcstress/">Java
                    Concurrency Stress Tests (jcstress)</a></b><br>
                &nbsp;&nbsp; The harness and the set of functional tests to
                break Java implementations on concurrency front. </p>
              <p><b><a href="http://openjdk.java.net/projects/code-tools/jol/">Java
                    Object Layout (jol)</a></b><br>
                &nbsp;&nbsp; The minimalistic tool box for field/object layout
                stuides.
                <!--
<p><b><a href="http://github.com/shipilev/fjp-trace/">fjp-trace: ForkJoinPool tracing and instrumentation</a></b><br>&nbsp;&nbsp; Useful to diagnose performance issues with JSR166 FJP.--></p>

              <p><b><a href="https://wiki.openjdk.java.net/display/shenandoah/Main">Shenandoah GC</a></b><br>
                &nbsp;&nbsp; Shenandoah is an ultra-low pause time garbage collector that reduces<br>
                &nbsp;&nbsp; GC pause times by performing more garbage collection work concurrently <br>
                &nbsp;&nbsp; with the running Java program. 
              </p>

              <p><b><a href="http://openjdk.java.net/jeps/318">Epsilon GC</a></b><br>
                &nbsp;&nbsp; Develop a GC that handles memory allocation but does not implement any actual memory <br>
                &nbsp;&nbsp; reclamation mechanism. Once the available Java heap is exhausted, the JVM will shut down. 
              </p>

              <p><b><a href="http://github.com/shipilev/">Other projects on
                    GitHub</a></b> </p>
            </blockquote>
            <h3>Non-techical articles and toy projects</h3>
            <table cellpadding="5">
              <tbody>
                <tr valign="top">
                  <td><br>
                  </td>
                  <td nowrap="nowrap"> <img src="web/flags/gb.png"> (ENG) <a href="articles/xkcd-1110/">XKCD-1110
                      full-view</a> </td>
                </tr>
              </tbody>
            </table>
        </td></tr>
      </tbody>
    </table>

  

</body></html>