{"id":1623,"date":"2017-11-13T19:40:28","date_gmt":"2017-11-13T19:40:28","guid":{"rendered":"http:\/\/nenadnoveljic.com\/blog\/?p=1623"},"modified":"2020-08-21T12:22:14","modified_gmt":"2020-08-21T12:22:14","slug":"memory-leak-parsing","status":"publish","type":"post","link":"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/","title":{"rendered":"Memory Leak During Parsing"},"content":{"rendered":"<p>In this blog post I&#8217;ll be exploring the behaviour of the Oracle function qcplgte and describing edge conditions that could lead to a memory leak during query parsing. The analysis was conducted on a Oracle 12.2 database and Solaris 11.<\/p>\n<h1>qcplgte<\/h1>\n<p>qcplgte is one of the auxiliary functions in Oracle database that underpin SQL parsing. In particular, this function divides the SQL text into several parts. In Oracle 12.2, the function receives a pointer through the second argument. The address to the next part of the SQL string to parse is stored at the 8 bytes offset. After parsing the portion of the SQL text, the function will update the same memory location with the pointer to the substring for the next parsing stage.<\/p>\n<p>The following picture shows how the function finds the SQL text to parse.<\/p>\n<div id=\"attachment_1637\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2017\/11\/qcplgte.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1637\" width=\"300\" height=\"107\" class=\"size-medium wp-image-1637\" alt=\"qcplgte\" src=\"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2017\/11\/qcplgte-300x107.png\" srcset=\"https:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2017\/11\/qcplgte-300x107.png 300w, https:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2017\/11\/qcplgte.png 454w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1637\" class=\"wp-caption-text\">qcplgte<\/p><\/div>\n<p>After having figured out the input, it is fairly easy to come up with gdb commands which will display all of the parsing stages:<\/p>\n<pre><code>break qcplgte\nset pagination off\ncommands 1\nsilent\nx\/s *(uint64_t *)($rsi+0x8)\ncontinue\nend<\/code><\/pre>\n<p>Here&#8217;s the short explanation of the commands above: According to <a href=\"https:\/\/en.wikipedia.org\/wiki\/X86_calling_conventions\" target=\"_blank\" rel=\"noopener noreferrer\">x64 calling convention for System V<\/a> the second parameter is passed through the %rsi register. The pointer to the SQL text is stored in the memory location %rsi+8. The OS is 64-bit, therefore casting to uint64_t when dereferencing %rsi+0x8. Finally, x\/s will dereference the pointer to the (sub)string which is stored on the memory location %rsi+0x8.<\/p>\n<p>Let&#8217;s trace the following simple query by using the gdb script above:<\/p>\n<pre><code>select a from t ;<\/code><\/pre>\n<p>where t is a very simple table created like this:<\/p>\n<pre><code>create table t (a number) ;\nexec dbms_stats.gather_table_stats (USER,'T') ;<\/code><\/pre>\n<p>Note: Gathering statistics before running the query is important to avoid the noise which would be otherwise created by recursive dynamic sampling queries.<\/p>\n<p>The excerpt from the gdb output:<\/p>\n<pre><code>0xffff80ffbfffb3c8:     \"select a from t\"\n0xffff80ffbfffb3ce:     \" a from t\"\n0xffff80ffbfffb3d0:     \" from t\"\n<span style=\"color: #ff0000;\">0xffff80ffbfffb3cf:     \"a from t\"<\/span>\n0xffff80ffbfffb3d0:     \" from t\"\n<span style=\"color: #ff0000;\">0xffff80ffbfffb3cf:     \"a from t\"<\/span>\n0xffff80ffbfffb3d0:     \" from t\"\n0xffff80ffbfffb3d5:     \" t\"\n0xffff80ffbfffb3d7:     \"\"\n0xffff80ffbfffb3d6:     \"t\"\n...<\/code><\/pre>\n<p>An interesting observation we can make by looking at the output above is that parsing is not linear. What I mean by that is the function had to examine some substrings, such as the one starting at the address <span style=\"color: #ff0000;\">0xffff80ffbfffb3cf<\/span>, twice even for such a simple query.<\/p>\n<h1>Footprint<\/h1>\n<p>Before making the initial query gradually more complex, we have to come up with a method for measuring the parsing footprint. For this reason, I wrote a DTrace script which collects the following information:<\/p>\n<ul>\n<li>number of qcplgte calls<\/li>\n<li>number of mmap calls<\/li>\n<li>allocated heap memory<\/li>\n<\/ul>\n<pre><code>#pragma D option quiet\n\npid$target::mmap:entry \n\/ (int)arg4 == -1 \/\n{\n  @bytes=sum(arg1);\n  @count_mmap=count();\n}\n\npid$target::qcplgte:entry {\n  @count_qcplgte=count();\n}\n\nEND {\n  printa(\"%@d Bytes \\n\", @bytes) ;\n  printa(\"%@d mmap calls \\n\", @count_mmap) ;\n  printa(\"%@d qcplgte calls \\n\", @count_qcplgte) ;\n}<\/code><\/pre>\n<p><a href=\"https:\/\/docs.oracle.com\/cd\/E36784_01\/html\/E36872\/mmap-2.html\" target=\"_blank\" rel=\"noopener noreferrer\">mmap<\/a> is the Kernel function for mapping files into the memory:<\/p>\n<pre><code>void *mmap(void *addr, <span style=\"color: #ff0000;\">size_t len<\/span>, int prot, int flags,\n            <span style=\"color: #ff0000;\">int fildes<\/span>, off_t off);<\/code><\/pre>\n<p>A special case is when the file descriptor -1 (5th argument) is specified. In this case, mmap will just allocate an anon segment of the size specified with the second argument. This is how Oracle parsing module is allocating heap memory.<\/p>\n<p>So, it&#8217;s time to check the footprint of our simple query:<\/p>\n<pre><code>23 qcplgte calls<\/code><\/pre>\n<p>Just 23 qcplgte calls were counted, not a single memory allocation was done.<\/p>\n<h1>Nonlinearity<\/h1>\n<p>Something interesting is going to happen if we enclose the selected column in couple of brackets :<\/p>\n<pre><code>select \n  case when \n  <span style=\"color: #ff0000;\">(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((\n  a &lt;=1\n  )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n  then 10\n  else null \n  end<\/span>\nfrom t ;<\/code><\/pre>\n<p>The number of qcplgte calls went through the roof, but still no memory allocations were recorded:<\/p>\n<pre><code><span style=\"color: #ff0000;\">1679092 qcplgte calls<\/span><\/code><\/pre>\n<p>Also, I added the &#8220;case when&#8221; just to amplify the nonlinearity effect.<\/p>\n<h1>Memory Allocations<\/h1>\n<p>Next, we are going to observe what is going to happen after we make the text of the query significantly bigger by embedding a huge comment.<\/p>\n<pre><code>select <span style=\"color: #ff0000;\">\/* insert some huge comment here *\/<\/span>\n  case when \n  (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((\n  t.a &lt;=1\n  )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n  then 10\n  else null \n  end\n  from <span style=\"color: #ff0000;\">sys.<\/span>t;<\/code><\/pre>\n<p>(You can download the query which I used in this test <a href=\"http:\/\/nenadnoveljic.com\/downloads\/query_with_a_huge_comment.sql\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>.)<\/p>\n<pre><code><span style=\"color: #ff0000;\">24117248 Bytes mmap \n22 mmap calls<\/span>\n1678213 qcplgte calls<\/code><\/pre>\n<p>It can be seen that making the query text bigger led to memory allocations.<\/p>\n<p>Besides that, I started to reference the table (in the from clause) fully qualified by adding the schema name. Because of that, the allocated memory doubled. This means, if we run the query above without specifying the schema name it will do only 11 mmap calls and allocate only half as much memory.<\/p>\n<p>Finally, something unexpected will happen when we fully qualify the column in the select clause:<\/p>\n<pre><code>select \/* insert some huge comment here *\/\n  case when \n  (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((\n  <span style=\"color: #ff0000;\">sys.<\/span>t.a &lt;=1\n  )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n  then 10\n  else null \n  end\n  from sys.t;<\/code><\/pre>\n<pre><code><span style=\"color: #ff0000;\">998506496 Bytes mmap \n944 mmap calls<\/span>\n1679989 qcplgte calls <\/code><\/pre>\n<p>Even though the number of qcplgte calls remained the same, <b>the allocated memory increased by 41 times after we fully qualified the column in the select.<\/b><\/p>\n<h1>Oracle 11.2.0.4<\/h1>\n<p>As opposed to Oracle 12c, referencing fully qualified column name hasn&#8217;t increased the memory consumption in Oracle 11.2. The same query allocates only 11 MB in Oracle 11.2:<\/p>\n<pre><code><span style=\"color: #ff0000;\">12451840 Bytes mmap \n8 mmap calls<\/span>\n949 qcplgte calls <\/code><\/pre>\n<h1>Real World Example<\/h1>\n<p>Frankly, I don\u2019t know why somebody would want to reference the columns name by specifying the schema name, but apparently there are some applications around that generate such queries. For instance, Josu\u00e9 Ribeiro constructed a  <a href=\"https:\/\/github.com\/josueribeiro\/oraclebugs\/tree\/master\/oracle12c\/bug_parse_sql\" target=\"_blank\" rel=\"noopener noreferrer\">reproducible test case<\/a> which is consuming tens of gigabaytes of memory on a 12c database until it hits the ORA-04030 error. In contrast, the same SQL runs smoothly on the 11.2 release. Also here, removing the schema name has proven to be an effective workaround.<\/p>\n<h1>Summary<\/h1>\n<p>To sum up, qcplgte is an auxiliary parsing function whose purpose is to extract the portion of the SQL text which will be parsed next. By observing pointer values it can be concluded that the parsing process needs to revisit certain places over and over again. In doing so, it will have to allocate heap memory for large (in respect to the length of the SQL text) queries. The memory consumption dramatically increases when the selected columns are referenced fully qualified including schema name in a 12c database. Fortunately, it is enough to remove the schema name when referencing the columns in the select to bring memory allocations back to the normal levels.<\/p>\n<h1>Update August 20, 2020<\/h1>\n<p>Oracle fixed this problem in 18c:<br \/>\n\n<table id=\"tablepress-14\" class=\"tablepress tablepress-id-14\">\n<thead>\n<tr class=\"row-1\">\n\t<td class=\"column-1\"><\/td><th class=\"column-2\">12c<\/th><th class=\"column-3\">18c<\/th><th class=\"column-4\">19c<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">allocated (MB)<\/td><td class=\"column-2\"><p style=\"color:red\">1979<\/p><\/td><td class=\"column-3\"><p style=\"color:green\">35<\/p><\/td><td class=\"column-4\"><p style=\"color:green\">24<\/p><\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\"># mmap calls<\/td><td class=\"column-2\"><p style=\"color:red\">1380<\/p><\/td><td class=\"column-3\"><p style=\"color:green\">26<\/p><\/td><td class=\"column-4\"><p style=\"color:green\">22<\/p><\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\"># qcplgte calls<\/td><td class=\"column-2\">3359978<\/td><td class=\"column-3\">1679989<\/td><td class=\"column-4\">1679989<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-14 from cache --><br \/>\nI tested with the following patch levels: 12.2.0.1.180116, 18.5.0.0.190115 and 19.7.0.0.200414.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Memory leak during parsing in Oracle 12c <a href=\"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/\" class=\"more-link\">Continue Reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[8,27,5,35,20],"tags":[],"class_list":["post-1623","post","type-post","status-publish","format-standard","hentry","category-12c","category-gdb","category-oracle","category-pga","category-slow-parsing"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Memory Leak During Parsing - All-round Database Topics<\/title>\n<meta name=\"description\" content=\"Edge conditions that lead to a memory leak during parsing\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Memory Leak During Parsing - All-round Database Topics\" \/>\n<meta property=\"og:description\" content=\"Edge conditions that lead to a memory leak during parsing\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/\" \/>\n<meta property=\"og:site_name\" content=\"All-round Database Topics\" \/>\n<meta property=\"article:published_time\" content=\"2017-11-13T19:40:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-08-21T12:22:14+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2017\/11\/qcplgte-300x107.png\" \/>\n<meta name=\"author\" content=\"Nenad Noveljic\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@NenadNoveljic\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nenad Noveljic\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/memory-leak-parsing\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/memory-leak-parsing\\\/\"},\"author\":{\"name\":\"Nenad Noveljic\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"headline\":\"Memory Leak During Parsing\",\"datePublished\":\"2017-11-13T19:40:28+00:00\",\"dateModified\":\"2020-08-21T12:22:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/memory-leak-parsing\\\/\"},\"wordCount\":898,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/memory-leak-parsing\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/nenadnoveljic.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/qcplgte-300x107.png\",\"articleSection\":[\"12c\",\"gdb\",\"Oracle\",\"PGA\",\"slow parsing\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/memory-leak-parsing\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/memory-leak-parsing\\\/\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/memory-leak-parsing\\\/\",\"name\":\"Memory Leak During Parsing - All-round Database Topics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/memory-leak-parsing\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/memory-leak-parsing\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/nenadnoveljic.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/qcplgte-300x107.png\",\"datePublished\":\"2017-11-13T19:40:28+00:00\",\"dateModified\":\"2020-08-21T12:22:14+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"description\":\"Edge conditions that lead to a memory leak during parsing\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/memory-leak-parsing\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/memory-leak-parsing\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/memory-leak-parsing\\\/#primaryimage\",\"url\":\"http:\\\/\\\/nenadnoveljic.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/qcplgte-300x107.png\",\"contentUrl\":\"http:\\\/\\\/nenadnoveljic.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/qcplgte-300x107.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/memory-leak-parsing\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Memory Leak During Parsing\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\",\"name\":\"All-round Database Topics\",\"description\":\"Nenad Noveljic\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\",\"name\":\"Nenad Noveljic\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"caption\":\"Nenad Noveljic\"},\"sameAs\":[\"nenad-noveljic-9b746a6\",\"https:\\\/\\\/x.com\\\/NenadNoveljic\"],\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/author\\\/nenad\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Memory Leak During Parsing - All-round Database Topics","description":"Edge conditions that lead to a memory leak during parsing","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:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/","og_locale":"en_US","og_type":"article","og_title":"Memory Leak During Parsing - All-round Database Topics","og_description":"Edge conditions that lead to a memory leak during parsing","og_url":"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/","og_site_name":"All-round Database Topics","article_published_time":"2017-11-13T19:40:28+00:00","article_modified_time":"2020-08-21T12:22:14+00:00","og_image":[{"url":"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2017\/11\/qcplgte-300x107.png","type":"","width":"","height":""}],"author":"Nenad Noveljic","twitter_card":"summary_large_image","twitter_creator":"@NenadNoveljic","twitter_misc":{"Written by":"Nenad Noveljic","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/#article","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/"},"author":{"name":"Nenad Noveljic","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"headline":"Memory Leak During Parsing","datePublished":"2017-11-13T19:40:28+00:00","dateModified":"2020-08-21T12:22:14+00:00","mainEntityOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/"},"wordCount":898,"commentCount":0,"image":{"@id":"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/#primaryimage"},"thumbnailUrl":"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2017\/11\/qcplgte-300x107.png","articleSection":["12c","gdb","Oracle","PGA","slow parsing"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/","url":"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/","name":"Memory Leak During Parsing - All-round Database Topics","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/#primaryimage"},"image":{"@id":"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/#primaryimage"},"thumbnailUrl":"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2017\/11\/qcplgte-300x107.png","datePublished":"2017-11-13T19:40:28+00:00","dateModified":"2020-08-21T12:22:14+00:00","author":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"description":"Edge conditions that lead to a memory leak during parsing","breadcrumb":{"@id":"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/#primaryimage","url":"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2017\/11\/qcplgte-300x107.png","contentUrl":"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2017\/11\/qcplgte-300x107.png"},{"@type":"BreadcrumbList","@id":"https:\/\/nenadnoveljic.com\/blog\/memory-leak-parsing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nenadnoveljic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Memory Leak During Parsing"}]},{"@type":"WebSite","@id":"https:\/\/nenadnoveljic.com\/blog\/#website","url":"https:\/\/nenadnoveljic.com\/blog\/","name":"All-round Database Topics","description":"Nenad Noveljic","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nenadnoveljic.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa","name":"Nenad Noveljic","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","caption":"Nenad Noveljic"},"sameAs":["nenad-noveljic-9b746a6","https:\/\/x.com\/NenadNoveljic"],"url":"https:\/\/nenadnoveljic.com\/blog\/author\/nenad\/"}]}},"_links":{"self":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/1623","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/comments?post=1623"}],"version-history":[{"count":1,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/1623\/revisions"}],"predecessor-version":[{"id":3465,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/1623\/revisions\/3465"}],"wp:attachment":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/media?parent=1623"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/categories?post=1623"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/tags?post=1623"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}