{"id":491,"date":"2011-08-30T20:47:00","date_gmt":"2011-08-30T20:47:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/what-every-programmer-should-know-about-the-memory-system.html"},"modified":"2012-10-21T20:03:46","modified_gmt":"2012-10-21T20:03:46","slug":"what-every-programmer-should-know-about","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html","title":{"rendered":"What every Programmer should know about the memory system"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align: left\">Traditionally, RAM, or Random Access Memory, was used to describe a  memory which offered the same access latency for all its memory  locations.&nbsp; This is barely the case with modern DRAM systems. In this  post, I describe a ten thousand foot view of how modern DRAMs work with  the hope that it can help the programmers in choosing their algorithms  and data structures wisely.<br \/>\n<span><\/span><br \/>\nIn the traditional view, memory was a flat monolithic structure with a  fixed access latency. Today\u2019s computer systems use page-mode addressing  and smart memory scheduling which makes this flat view look rather  naive. In my opinion, there are four concepts every programmer must be  familiar with: pages, banks, row conflicts, and FR-FCFS.<\/p>\n<p><strong>Pages<\/strong><br \/>\nData in the DRAM is stored at a <i>page<\/i> granularity. The size  of a typical page is between 4K to 16K. In theory, this size is  independent of the OS pages which are typically 4KB each. In practice,  most DRAMs use pages bigger than the OS pages in order to improve  locality in the row buffers (described below).<\/p>\n<p><strong>Banks<\/strong><br \/>\nTo reduce access latency, memory is split into multiple equal-sized  units called banks. Most DRAM chips today have 8 to 16 banks. Each bank  stores tens of thousands of pages.<br \/>\nThe following is a practical example of how a 4 GB (32-bit) physical  address will be split by the DRAM (credit to my friend Khubaib). Bits  12-0 identify the byte within the 8KB page. Bits 16-13 identify which of  the 16 memory channels the system should use for this address. Bits  20-17 identify which of the 16 banks the address will be found in and  Bits 32-21 identify which row within the bank is accessed. Channel bits  are used to split banks across DRAM modules in order to increase the  bandwidth to DRAM.<br \/>\nA memory bank can only service one request at a time. Any other  accesses to the same bank must wait for the previous access to complete,  known as a bank-conflict. In contrast, memory access to different banks  can proceed in parallel (known as bank-level parallelism).<\/p>\n<p><strong>Row-Buffer<\/strong><br \/>\nEach DRAM bank has one <i>row-buffer, <\/i>a structure which provides access to the page which is <i>open<\/i> at the bank. Before a memory location can be read, the entire page containing that memory location is <i>opened<\/i> and read into the <i>row buffer<\/i>.<i> <\/i>The page stays in the row buffer until it is explicitly <i>closed<\/i>.  If an access to the open page arrives at the bank, it can be serviced  immediately from the row buffer within a single memory cycle. This  scenario is called a row-buffer hit (typically less than ten processor  cycles). However, if an access to another row arrives, the current row  must be closed and the new row must be opened before the request can be  serviced. This is called a row-buffer conflict. A row-buffer conflict  incurs substantial delay in DRAM (typically 70+ processor cycles).<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p><strong>FR-FCFS<\/strong><br \/>\nMemory accesses are not sent to the DRAM in the order they are sent  by the core. Instead, they are buffered in the on-chip memory request  buffers and dispatched to the DRAM in the order specified by the memory  scheduler. To maximize throughput of the memory system, memory  schedulers today employ a policy called the First Row-First Come First  Serve (FR-FCFS). The idea is to prioritize accesses to the page which is  currently open in order to minimize the number of row conflicts. While  this helps with memory throughput, it further increases the penalty of a  row buffer conflict. As a rule of thumb, a row buffer conflict takes at  least 3x the time of a row-buffer hit. It is important to note that all  known memory scheduling algorithms schedule requests for each bank  completely independently and, thus, have no impact on bank-level  parallelism.<\/p>\n<p><strong>What can programmers do?<\/strong><\/p>\n<p><i>Avoid memory accesses: <\/i>I cannot stress this enough. Memory  may seem free in terms of storage but it costs a lot more in performance  if the working data set size becomes bigger than the cache or the  available DRAM. It is ultimately a good idea to reduce the memory  footprint as much as reasonably possible, especially on embedded  devices.<\/p>\n<p><i>Bank conflicts: <\/i>In general, application programmers work  with virtual addresses while the DRAM operates on physical addresses.&nbsp;  Thus, programmers cannot reduce hazards like bank conflicts as they have  no control over the placement of data in physical memory. However,  there are some special scenarios where the programmers can help. For  example, most ISAs have now introduced virtual pages that are as big as  1GB. Programmers are allowed to do their own mapping within these large  pages. This gives the programmers a lot more control over what data goes  to which bank and they can use this control to increase bank-level  parallelism.<\/p>\n<p><i>Row-Buffer Conflicts: <\/i>Programmers can also help by  increasing the spatial locality in the row buffer, .i., try to make  consecutive memory accesses as close to each other as possible. This  often implies packing data which is likely to be accessed together in  consecutive memory locations, e.g., building a struct of arrays is often  better performance. By the way, this also implies that linked data  structures that promote random accesses should be avoided as much as  possible because each row buffer conflict has a latency greater than 100  computes.<\/p>\n<p><strong>Experimental Data<\/strong><br \/>\nI did <a href=\"http:\/\/www.futurechips.org\/chip-design-for-all\/cortex-a8-tips-optimizing-iphone-apps.html\">an experiment in this post<\/a> on an ARM Cortex A8 which showed that sequential accesses cost only 20  processor cycles but random accesses cost close to 180 cycles. The same  experiment on an i7 led to about a 2x boost from sequential accesses.<\/p>\n<p><strong>Conclusion<\/strong><br \/>\nProgrammers can save battery and increase performance via DRAM-aware  programming. Such optimizations may not be practical in all scenarios  but understanding the basic DRAM structure can help programmers identify  existing or potential performance bottlenecks, specially on more  constrained platforms like the iPhone.<\/p>\n<p><strong><i>Reference: <\/i><\/strong><a href=\"http:\/\/www.futurechips.org\/chip-design-for-all\/what-every-programmer-should-know-about-the-memory-system.html\">What every Programmer should know about the memory system<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a> Aater at the <a href=\"http:\/\/www.futurechips.org\/\">Future Chips blog<\/a>.<\/p>\n<div style=\"margin: 0px\"><strong><i>Related Articles :<\/i><\/strong><\/div>\n<ul>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2011\/08\/eclipse-memory-analyzer-mat.html\">Eclipse Memory Analyzer (MAT)<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2011\/04\/erlang-vs-java-memory-architecture.html\">Erlang vs Java memory architecture<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/12\/things-every-programmer-should-know.html\">Things Every Programmer Should Know<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2011\/07\/java-and-memory-leaks.html\">Java and Memory Leaks<\/a> <\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2011\/07\/top-97-things-every-programmer-or.html\">The top 9+7 things every programmer or architect should know<\/a> <\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Traditionally, RAM, or Random Access Memory, was used to describe a memory which offered the same access latency for all its memory locations.&nbsp; This is barely the case with modern DRAM systems. In this post, I describe a ten thousand foot view of how modern DRAMs work with the hope that it can help the &hellip;<\/p>\n","protected":false},"author":54,"featured_media":2386,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[218],"class_list":["post-491","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-development","tag-memory"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>What every Programmer should know about the memory system - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Traditionally, RAM, or Random Access Memory, was used to describe a memory which offered the same access latency for all its memory locations.&nbsp; This\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"What every Programmer should know about the memory system - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Traditionally, RAM, or Random Access Memory, was used to describe a memory which offered the same access latency for all its memory locations.&nbsp; This\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2011-08-30T20:47:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-21T20:03:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/software-development-2-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Aater Suleman\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Aater Suleman\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/08\\\/what-every-programmer-should-know-about.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/08\\\/what-every-programmer-should-know-about.html\"},\"author\":{\"name\":\"Aater Suleman\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/947b649072790438ddc756d692781072\"},\"headline\":\"What every Programmer should know about the memory system\",\"datePublished\":\"2011-08-30T20:47:00+00:00\",\"dateModified\":\"2012-10-21T20:03:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/08\\\/what-every-programmer-should-know-about.html\"},\"wordCount\":1022,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/08\\\/what-every-programmer-should-know-about.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/software-development-2-logo.jpg\",\"keywords\":[\"Memory\"],\"articleSection\":[\"Software Development\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/08\\\/what-every-programmer-should-know-about.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/08\\\/what-every-programmer-should-know-about.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/08\\\/what-every-programmer-should-know-about.html\",\"name\":\"What every Programmer should know about the memory system - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/08\\\/what-every-programmer-should-know-about.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/08\\\/what-every-programmer-should-know-about.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/software-development-2-logo.jpg\",\"datePublished\":\"2011-08-30T20:47:00+00:00\",\"dateModified\":\"2012-10-21T20:03:46+00:00\",\"description\":\"Traditionally, RAM, or Random Access Memory, was used to describe a memory which offered the same access latency for all its memory locations.&nbsp; This\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/08\\\/what-every-programmer-should-know-about.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/08\\\/what-every-programmer-should-know-about.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/08\\\/what-every-programmer-should-know-about.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/software-development-2-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/software-development-2-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/08\\\/what-every-programmer-should-know-about.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Software Development\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/software-development\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"What every Programmer should know about the memory system\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/947b649072790438ddc756d692781072\",\"name\":\"Aater Suleman\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d1bca6c29228270d389cd99f943130da59219435f479cce2421b3e52a108b6a4?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d1bca6c29228270d389cd99f943130da59219435f479cce2421b3e52a108b6a4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d1bca6c29228270d389cd99f943130da59219435f479cce2421b3e52a108b6a4?s=96&d=mm&r=g\",\"caption\":\"Aater Suleman\"},\"sameAs\":[\"http:\\\/\\\/www.futurechips.org\\\/\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Aater-Suleman\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"What every Programmer should know about the memory system - Java Code Geeks","description":"Traditionally, RAM, or Random Access Memory, was used to describe a memory which offered the same access latency for all its memory locations.&nbsp; This","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:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html","og_locale":"en_US","og_type":"article","og_title":"What every Programmer should know about the memory system - Java Code Geeks","og_description":"Traditionally, RAM, or Random Access Memory, was used to describe a memory which offered the same access latency for all its memory locations.&nbsp; This","og_url":"https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2011-08-30T20:47:00+00:00","article_modified_time":"2012-10-21T20:03:46+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/software-development-2-logo.jpg","type":"image\/jpeg"}],"author":"Aater Suleman","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Aater Suleman","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html"},"author":{"name":"Aater Suleman","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/947b649072790438ddc756d692781072"},"headline":"What every Programmer should know about the memory system","datePublished":"2011-08-30T20:47:00+00:00","dateModified":"2012-10-21T20:03:46+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html"},"wordCount":1022,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/software-development-2-logo.jpg","keywords":["Memory"],"articleSection":["Software Development"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html","url":"https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html","name":"What every Programmer should know about the memory system - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/software-development-2-logo.jpg","datePublished":"2011-08-30T20:47:00+00:00","dateModified":"2012-10-21T20:03:46+00:00","description":"Traditionally, RAM, or Random Access Memory, was used to describe a memory which offered the same access latency for all its memory locations.&nbsp; This","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/software-development-2-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/software-development-2-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2011\/08\/what-every-programmer-should-know-about.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Software Development","item":"https:\/\/www.javacodegeeks.com\/category\/software-development"},{"@type":"ListItem","position":3,"name":"What every Programmer should know about the memory system"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/947b649072790438ddc756d692781072","name":"Aater Suleman","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d1bca6c29228270d389cd99f943130da59219435f479cce2421b3e52a108b6a4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d1bca6c29228270d389cd99f943130da59219435f479cce2421b3e52a108b6a4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d1bca6c29228270d389cd99f943130da59219435f479cce2421b3e52a108b6a4?s=96&d=mm&r=g","caption":"Aater Suleman"},"sameAs":["http:\/\/www.futurechips.org\/"],"url":"https:\/\/www.javacodegeeks.com\/author\/Aater-Suleman"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/491","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/54"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=491"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/491\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/2386"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=491"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=491"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=491"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}