{"id":240,"date":"2017-03-22T01:32:33","date_gmt":"2017-03-22T00:32:33","guid":{"rendered":"http:\/\/antek.atthost24.pl\/?p=240"},"modified":"2017-03-22T22:57:41","modified_gmt":"2017-03-22T21:57:41","slug":"ile-on-wazy","status":"publish","type":"post","link":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/22\/ile-on-wazy\/","title":{"rendered":"Ile on wa\u017cy?!"},"content":{"rendered":"<p>Czy zastanawiali\u015bcie si\u0119 kiedy\u015b jak du\u017co pami\u0119ci zajmuj\u0105 obiekty w Javie? Du\u017co os\u00f3b pewnie nigdy si\u0119 nad tym nie g\u0142owi\u0142o, a przynajmniej nie przed pierwszym OutOfMemoryError \ud83d\ude09<\/p>\n<p>W tym wpisie postaram si\u0119 pokaza\u0107 w jaki spos\u00f3b oszacowa\u0107 wielko\u015b\u0107 obiekt\u00f3w, kt\u00f3re tworzymy w Javie.<\/p>\n<h3>Typy prymitywne<\/h3>\n<p>Niew\u0105tpliwie naj\u0142atwiej jest okre\u015bli\u0107 ilo\u015b\u0107 pami\u0119ci zajmowanej przez typy prymitywne. Poni\u017cej przedstawiam tabelk\u0119, kt\u00f3ra pokazuje ile ka\u017cdy z typ\u00f3w potrzebuj\u0119 bajt\u00f3w w pami\u0119ci.<\/p>\n\n<table id=\"tablepress-2\" class=\"tablepress tablepress-id-2\">\n<thead>\n<tr class=\"row-1 odd\">\n\t<th class=\"column-1\">Typ<\/th><th class=\"column-2\">bajty<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-hover\">\n<tr class=\"row-2 even\">\n\t<td class=\"column-1\">boolean<\/td><td class=\"column-2\">1<\/td>\n<\/tr>\n<tr class=\"row-3 odd\">\n\t<td class=\"column-1\">byte<\/td><td class=\"column-2\">1<\/td>\n<\/tr>\n<tr class=\"row-4 even\">\n\t<td class=\"column-1\">char<\/td><td class=\"column-2\">2<\/td>\n<\/tr>\n<tr class=\"row-5 odd\">\n\t<td class=\"column-1\">int<\/td><td class=\"column-2\">4<\/td>\n<\/tr>\n<tr class=\"row-6 even\">\n\t<td class=\"column-1\">float<\/td><td class=\"column-2\">4<\/td>\n<\/tr>\n<tr class=\"row-7 odd\">\n\t<td class=\"column-1\">long<\/td><td class=\"column-2\">8<\/td>\n<\/tr>\n<tr class=\"row-8 even\">\n\t<td class=\"column-1\">double<\/td><td class=\"column-2\">8<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-2 from cache -->\n<p>Ilo\u015b\u0107 pami\u0119ci potrzebnej do przechowywania booleana mo\u017ce troch\u0119 dziwi\u0107. W ko\u0144cu mo\u017ce on przyj\u0105\u0107 tylko dwa warto\u015bci i w teorii powinien zajmowa\u0107 1 bit. Specyfikacja JVM nie definiuje ile pami\u0119ci jest potrzebne na przechowanie booleana i zale\u017cy to od danej implementacji. Dla uproszczenia mo\u017cemy \u015bmia\u0142o przyj\u0105\u0107, \u017ce jest potrzebny 1 bajt.<\/p>\n<p>Reszta warto\u015bci wydaj\u0119 si\u0119 by\u0107 w miar\u0119 oczywista \ud83d\ude42<\/p>\n<h3>Tablice<\/h3>\n<p>Ka\u017cda tablica\u00a0zajmuje wielokrotno\u015b\u0107 danego typu (co wydaj\u0119 si\u0119 oczywiste ;)) oraz dodatkowe 24 bajty, kt\u00f3re s\u0105 narzutem tablicy. Poni\u017cej przedstawiam tabelk\u0119 z przyk\u0142adami, kt\u00f3re powinny wszystko wyja\u015bni\u0107.<\/p>\n\n<table id=\"tablepress-3\" class=\"tablepress tablepress-id-3\">\n<thead>\n<tr class=\"row-1 odd\">\n\t<th class=\"column-1\">Typ<\/th><th class=\"column-2\">bajty<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-hover\">\n<tr class=\"row-2 even\">\n\t<td class=\"column-1\">byte[]<\/td><td class=\"column-2\">N + 24<\/td>\n<\/tr>\n<tr class=\"row-3 odd\">\n\t<td class=\"column-1\">char[]<\/td><td class=\"column-2\">2N+24<\/td>\n<\/tr>\n<tr class=\"row-4 even\">\n\t<td class=\"column-1\">int[]<\/td><td class=\"column-2\">4N+24<\/td>\n<\/tr>\n<tr class=\"row-5 odd\">\n\t<td class=\"column-1\">double[]<\/td><td class=\"column-2\">8N+24<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-3 from cache -->\n<h3>Obiekty<\/h3>\n<p>I teraz przechodzimy do mi\u0119sa tematu \u00a0&#8211; czyli jak oszacowa\u0107 wielko\u015b\u0107 obiektu naszej klasy.<\/p>\n<p>Aby to zrobi\u0107 potrzebujemy kilku dodatkowych informacji.<\/p>\n<h4>Narzut obiektu<\/h4>\n<p>Ka\u017cdy obiekt, podobnie jak tablica, powoduje\u00a0dodatkowy narzut pami\u0119ci. W tym przypadku jest to 16 bajt\u00f3w.<\/p>\n<h4>Referencja<\/h4>\n<p>Ka\u017cda przetrzymywana referencja w naszym obiekcie to dodatkowe 8 bajt\u00f3w.<\/p>\n<h4>Padding<\/h4>\n<p>Wielko\u015b\u0107 ka\u017cdego obiektu jest uzupe\u0142niana do wielokrotno\u015bci 8 bajt\u00f3w.<\/p>\n<h4>Praktyka \ud83d\ude42<\/h4>\n<p>Jako przyk\u0142ad we\u017amy klas\u0119 String. Poni\u017cej przedstawiam wycinek implementacji tej klasy, kt\u00f3ry jest potrzebny do oszacowania wielko\u015bci obiektu.<\/p>\n<pre class=\"lang:java decode:true \">public final class String\r\n\timplements java.io.Serializable, Comparable&lt;String&gt;, CharSequence {\r\n    \r\n\tprivate final char value[];\r\n\tprivate final int offset;\r\n\tprivate final int count;\r\n\tprivate int hash;\r\n\r\n\t...\r\n}<\/pre>\n<p>Do obliczenia potrzebujemy zsumowa\u0107 kilka rzeczy:<\/p>\n<ol>\n<li>Narzut obiektu &#8211; 16 bajt\u00f3w<\/li>\n<li>Referencja do tablicy &#8211; 8 bajt\u00f3w<\/li>\n<li>Tablica &#8211; 2N + narzut tablicy 24 bajty<\/li>\n<li>Pole offset &#8211; 4 bajty<\/li>\n<li>Pole count &#8211; 4 bajty<\/li>\n<li>Pole hash &#8211; 4 bajty<\/li>\n<\/ol>\n<p>Zsumowuj\u0105c wszystko wychodzi nam 2N + 60 bajt\u00f3w. W takim przypadku musimy jeszcze pami\u0119ta\u0107 o paddingu, czyli dodajemy 4 bajty, aby ca\u0142kowita wielko\u015b\u0107 obiektu by\u0142a wielokrotno\u015bci\u0105 8.<\/p>\n<h3>Podsumowanie<\/h3>\n<p>Powy\u017cej przedstawi\u0142em og\u00f3lne zasady, kt\u00f3rych mo\u017cemy u\u017cy\u0107, aby oszacowa\u0107 wielko\u015b\u0107 naszych obiekt\u00f3w w Javie. Dzi\u0119ki temu mo\u017cemy lepiej\u00a0zrozumie\u0107 co jest alokowane w pami\u0119ci i jaki rozmiar zajmuje.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Czy zastanawiali\u015bcie si\u0119 kiedy\u015b jak du\u017co pami\u0119ci zajmuj\u0105 obiekty w Javie? Du\u017co os\u00f3b pewnie nigdy si\u0119 nad tym nie g\u0142owi\u0142o, a przynajmniej nie przed pierwszym OutOfMemoryError \ud83d\ude09 W&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,7,16],"tags":[8,17,18],"class_list":["post-240","post","type-post","status-publish","format-standard","hentry","category-dsp2017","category-java","category-pamiec-w-jvm","tag-java","tag-jvm","tag-pamiec"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Ile on wa\u017cy?! - Lukasz Antkowiak&#039;s blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/22\/ile-on-wazy\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ile on wa\u017cy?! - Lukasz Antkowiak&#039;s blog\" \/>\n<meta property=\"og:description\" content=\"Czy zastanawiali\u015bcie si\u0119 kiedy\u015b jak du\u017co pami\u0119ci zajmuj\u0105 obiekty w Javie? Du\u017co os\u00f3b pewnie nigdy si\u0119 nad tym nie g\u0142owi\u0142o, a przynajmniej nie przed pierwszym OutOfMemoryError \ud83d\ude09 W...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/22\/ile-on-wazy\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukasz Antkowiak&#039;s blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-03-22T00:32:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-03-22T21:57:41+00:00\" \/>\n<meta name=\"author\" content=\"\u0141ukasz Antkowiak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u0141ukasz Antkowiak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minuty\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/22\/ile-on-wazy\/\",\"url\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/22\/ile-on-wazy\/\",\"name\":\"Ile on wa\u017cy?! - Lukasz Antkowiak&#039;s blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/#website\"},\"datePublished\":\"2017-03-22T00:32:33+00:00\",\"dateModified\":\"2017-03-22T21:57:41+00:00\",\"author\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/22\/ile-on-wazy\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/22\/ile-on-wazy\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/22\/ile-on-wazy\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/blog.lantkowiak.pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ile on wa\u017cy?!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#website\",\"url\":\"https:\/\/blog.lantkowiak.pl\/\",\"name\":\"Lukasz Antkowiak&#039;s blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.lantkowiak.pl\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6\",\"name\":\"\u0141ukasz Antkowiak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g\",\"caption\":\"\u0141ukasz Antkowiak\"},\"description\":\"dd\",\"url\":\"https:\/\/blog.lantkowiak.pl\/index.php\/author\/antek\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ile on wa\u017cy?! - Lukasz Antkowiak&#039;s blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/22\/ile-on-wazy\/","og_locale":"pl_PL","og_type":"article","og_title":"Ile on wa\u017cy?! - Lukasz Antkowiak&#039;s blog","og_description":"Czy zastanawiali\u015bcie si\u0119 kiedy\u015b jak du\u017co pami\u0119ci zajmuj\u0105 obiekty w Javie? Du\u017co os\u00f3b pewnie nigdy si\u0119 nad tym nie g\u0142owi\u0142o, a przynajmniej nie przed pierwszym OutOfMemoryError \ud83d\ude09 W...","og_url":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/22\/ile-on-wazy\/","og_site_name":"Lukasz Antkowiak&#039;s blog","article_published_time":"2017-03-22T00:32:33+00:00","article_modified_time":"2017-03-22T21:57:41+00:00","author":"\u0141ukasz Antkowiak","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"\u0141ukasz Antkowiak","Szacowany czas czytania":"2 minuty"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/22\/ile-on-wazy\/","url":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/22\/ile-on-wazy\/","name":"Ile on wa\u017cy?! - Lukasz Antkowiak&#039;s blog","isPartOf":{"@id":"https:\/\/blog.lantkowiak.pl\/#website"},"datePublished":"2017-03-22T00:32:33+00:00","dateModified":"2017-03-22T21:57:41+00:00","author":{"@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6"},"breadcrumb":{"@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/22\/ile-on-wazy\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/22\/ile-on-wazy\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/22\/ile-on-wazy\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/blog.lantkowiak.pl\/"},{"@type":"ListItem","position":2,"name":"Ile on wa\u017cy?!"}]},{"@type":"WebSite","@id":"https:\/\/blog.lantkowiak.pl\/#website","url":"https:\/\/blog.lantkowiak.pl\/","name":"Lukasz Antkowiak&#039;s blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.lantkowiak.pl\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Person","@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6","name":"\u0141ukasz Antkowiak","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g","caption":"\u0141ukasz Antkowiak"},"description":"dd","url":"https:\/\/blog.lantkowiak.pl\/index.php\/author\/antek\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/240","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/comments?post=240"}],"version-history":[{"count":5,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/240\/revisions"}],"predecessor-version":[{"id":254,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/240\/revisions\/254"}],"wp:attachment":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/media?parent=240"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/categories?post=240"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/tags?post=240"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}