{"id":296996,"date":"2017-12-12T05:00:00","date_gmt":"2017-12-12T05:00:00","guid":{"rendered":"https:\/\/integralads.com\/insider\/beat-java-bottlenecks\/"},"modified":"2023-07-12T11:58:57","modified_gmt":"2023-07-12T11:58:57","slug":"beat-java-bottlenecks","status":"publish","type":"post","link":"https:\/\/integralads.com\/apac\/insider\/beat-java-bottlenecks\/","title":{"rendered":"Beat the Java Bottlenecks"},"content":{"rendered":"<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\"><span style=\"font-weight: 400;\">The overall performance of an application can be contingent upon a variety of factors, and often performance tuning can be more of an art than a science. While performance can be a secondary benefit in some applications, in high throughput applications such as ad servers, performance bottlenecks can act as fatal blows to an otherwise well-designed application. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Given the fact that most applications have a similar purpose and are crafted by developers who have a similar line of thinking, there are certain common traps that a lot of developers can fall into. Luckily these are ubiquitous and easy to spot. So as a performance tuner, if you do not know where to start when it comes to fixing your application code, below are three great starting blocks. <\/span><\/p>\n<h2><b>#1: Reflection traps<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Reflection is an awesome and powerful tool. However, if used incorrectly, it can be devastating to performance. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Consider the following:<\/span><\/p>\n<pre><em><span style=\"font-weight: 400;\">\u00a0 org.apache.logging.log4j.Logger manager =\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0org.apache.logging.log4j.LogManager.getLogger();<\/span>\n\n<span style=\"font-weight: 400;\">\/\/ This calls LoaderUtil.loadClass(element.getClassName());<\/span>\n<span style=\"font-weight: 400;\">\/\/ Which in turn calls\n<\/span><span style=\"font-weight: 400;\">\/\/ java.lang.ClassLoader.loadClass(java.lang.String, boolean)<\/span>\n<span style=\"font-weight: 400;\">\/\/ which has a code which goes like this synchronized\n<\/span><span style=\"font-weight: 400;\">\/\/ (getClassLoadingLock(name)) { ... }<\/span><\/em><\/pre>\n<p><span style=\"font-weight: 400;\">At the outset, it looks like perfectly harmless code, but if you delve deeper this is not the case. You will see that it locks on the entire class, which in turn locks any thread that is using this class. This happens because we did not have the will to write the class name, but there are actually many variables involved. There is now a \u201cuse fast reflection\u201d mode that may be useful here. But at the time of writing such a line, we are not really aware of what goes on and therefore we may be contributing to such a bottleneck for no reason whatsoever. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">If we take a thread dump and find a lot of threads locked because they are waiting on a class, this is generally a sign that the object at hand is using some reflection-based framework.<\/span><\/p>\n<h4><b>Solution<\/b><\/h4>\n<p><span style=\"font-weight: 400;\">Dig into the code of the library and make sure it\u2019s being used as intended. Also, run a profiler from time to time to make sure this is not a bottleneck for the code.<\/span><\/p>\n<h2><b>#2: JVM and garbage collection<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">(For the purpose of this article, I will keep this section confined to a Concurrent Mark and Sweep GC.)<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The code at IAS is responsible for servicing a huge number of requests per second. The routines that do this are highly-iterative and tend to generate tons of temporary objects on Eden space that are used once and immediately discarded.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">However, if the Eden Space is being garbage collected in the midst of a request, the temporary objects end up spilling into the survivor space.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Now, as mentioned in the previous section, there aren\u2019t many survivor objects in our code, given that most requests end up creating objects on the fly. But that is not what a generational garbage collector is designed to do. Hence, a badly tuned GC might end up making a lot of spillover objects fall into survivor space, which may result in them staying in the memory longer than required. Repeated full GCs are a sign of such an event.<\/span><\/p>\n<h4><b>Solution<\/b><\/h4>\n<p><span style=\"font-weight: 400;\">Adjusting the survivor ratio can work wonders for performance. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">For example, the default survivor ratio is 6, but we don\u2019t really need such a huge survivor space. For our application, we would, in fact, have been OK with a hypothetical fractional value. But since it cannot be a fraction, we can at the very least have a <\/span><span style=\"font-weight: 400;\">-XX:SurvivorRatio=6<\/span><span style=\"font-weight: 400;\"> JVM parameter to fine-tune the garbage collector.<\/span><\/p>\n<h2><b>#3: Database calls<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Database calls are made throughout a typical application for a variety of reasons. For example, an operation as benign as saving an object in an ORM leads to a database call. All those database calls take time and can quickly tally up. Add to that the complexity associated when saving an object that involves checking foreign key constraints, which is compounded, when that foreign key is not indexed.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The sophisticated and preferred way to eliminate unnecessary database related waiting is to use a profiler to find out the exact time spent in each method and each object. But, there is a brute force method that you may find useful if, like me, you do not want to spend a long time setting up the profiler and reading the manual for VisualVM. Simply put, if you send ten requests to your app and take ten thread dumps and then four out of ten are in the same method, you have found the likely bottleneck.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Once you\u2019ve found the problem, there are a couple of potential solutions.<\/span><\/p>\n<h4><b>Solution 1: Caching<\/b><\/h4>\n<p><span style=\"font-weight: 400;\">Caching is one amazing way to avoid sending requests to the slow (and potentially unnecessary) bottleneck that is the database. Especially when it comes to objects that do not experience a lot of modification. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Here is some example code that will keep a local cache using the <\/span><a href=\"https:\/\/github.com\/google\/guava\/wiki\/CachesExplained\"><span style=\"font-weight: 400;\">CacheBuilder<\/span><\/a><span style=\"font-weight: 400;\"> tools made available by our friends at Google:<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">LoadingCache&lt;Key, Graph&gt; graphs = CacheBuilder.newBuilder()<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0.maximumSize(1000)<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0.expireAfterWrite(10, TimeUnit.MINUTES)<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0.removalListener(MY_LISTENER)<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0.build(new CacheLoader&lt;Key, Graph&gt;() {<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public Graph load(Key key) throws AnyException {<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return createExpensiveGraph(key);<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0});<\/span><\/pre>\n<p><b>Solution 2: Joins in queries<\/b><\/p>\n<p><span style=\"font-weight: 400;\">An often overlooked solution to a lot of database call performance problems is to apply a <\/span><a href=\"https:\/\/en.wikipedia.org\/wiki\/Program_evaluation_and_review_technique\"><span style=\"font-weight: 400;\">CPM\/PERT<\/span><\/a><span style=\"font-weight: 400;\"> project-management approach to things. In other words, figure out all the tasks that take place in the application and find the dependencies between them. This will help you find a critical path in the application which you can then focus on optimizing.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For example, instead of going back and forth with calls to your database, use joins to replace loops where possible. This is not a \u201cone size fits all\u201d solution, but in our code, I was able to find a lot of instances where this made a difference.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Consider a schema where an employee belongs to an organizational department. You want to find out the sum of all the salaries of all employees in a particular department. You run a query such as the following:<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">select employee from department where department.name = \u201caccounts\u201d<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">Then you loop over this dataset that is returned by doing something like this:<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">sum = 0<\/span>\n\n<span style=\"font-weight: 400;\">for each employee_selected<\/span>\n\n<span style=\"font-weight: 400;\">sum + = select sum(employee.salary) from employee where employee.id = employee_selected.id<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">While that is a valid approach, it could be optimized by using a join instead of a loop like this:<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">select sum(employee.salary) from employee join department on employee.departmentId = department.departmentId where department.name = \u201caccounts\u201d<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">Adding a join below the select may seem counterintuitive to database theory, but the outcome is that the code only makes a single round trip to the database instead of many (possibly thousands).<\/span><\/p>\n<p><b>Solution 3: Compression<\/b><\/p>\n<p><span style=\"font-weight: 400;\">This is primarily for cases where we end up with a large amount of data that is returned as a query result. If using the useCompression=true URL parameter for MySQL, we can now trade in smaller network payload for a slightly increased CPU consumption. Given that the network is slower than the CPU, usually find faster returns from the database, thereby having better performance.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Hopefully this post has provided you with useful tips and tricks on how to avoid bottlenecks in Java applications. I tried to list a few places where I have identified code performance issues in my experience at IAS. This list is in no way exhaustive, nor is it always the best way to approach every problem. However, taking these small, non-intrusive steps has often helped me to achieve big results. I hope these steps help do the same for you.<\/span><\/span><\/span><\/span><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The overall performance of an application can be contingent upon a variety of factors, and often performance tuning can be more of an art than a science. While performance can be a secondary benefit in some applications, in high throughput&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[218],"tags":[],"class_list":["post-296996","post","type-post","status-publish","format-standard","hentry","category-insights-apac"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.4 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Beat the Java Bottlenecks - Integral Ad Science<\/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:\/\/integralads.com\/apac\/insider\/beat-java-bottlenecks\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Beat the Java Bottlenecks\" \/>\n<meta property=\"og:description\" content=\"The overall performance of an application can be contingent upon a variety of factors, and often performance tuning can be more of an art than a science. While performance can be a secondary benefit in some applications, in high throughput...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/integralads.com\/apac\/insider\/beat-java-bottlenecks\/\" \/>\n<meta property=\"og:site_name\" content=\"Integral Ad Science\" \/>\n<meta property=\"article:published_time\" content=\"2017-12-12T05:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-12T11:58:57+00:00\" \/>\n<meta name=\"author\" content=\"IAS TEAM\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@integralads\" \/>\n<meta name=\"twitter:site\" content=\"@integralads\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"IAS TEAM\" \/>\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:\\\/\\\/integralads.com\\\/apac\\\/insider\\\/beat-java-bottlenecks\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/integralads.com\\\/apac\\\/insider\\\/beat-java-bottlenecks\\\/\"},\"author\":{\"name\":\"IAS TEAM\",\"@id\":\"https:\\\/\\\/integralads.com\\\/#\\\/schema\\\/person\\\/dbee79df007713b5bab3127e3f349399\"},\"headline\":\"Beat the Java Bottlenecks\",\"datePublished\":\"2017-12-12T05:00:00+00:00\",\"dateModified\":\"2023-07-12T11:58:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/integralads.com\\\/apac\\\/insider\\\/beat-java-bottlenecks\\\/\"},\"wordCount\":1163,\"publisher\":{\"@id\":\"https:\\\/\\\/integralads.com\\\/#organization\"},\"articleSection\":[\"Insights\"],\"inLanguage\":\"en-APAC\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/integralads.com\\\/apac\\\/insider\\\/beat-java-bottlenecks\\\/\",\"url\":\"https:\\\/\\\/integralads.com\\\/apac\\\/insider\\\/beat-java-bottlenecks\\\/\",\"name\":\"Beat the Java Bottlenecks - Integral Ad Science\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/integralads.com\\\/#website\"},\"datePublished\":\"2017-12-12T05:00:00+00:00\",\"dateModified\":\"2023-07-12T11:58:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/integralads.com\\\/apac\\\/insider\\\/beat-java-bottlenecks\\\/#breadcrumb\"},\"inLanguage\":\"en-APAC\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/integralads.com\\\/apac\\\/insider\\\/beat-java-bottlenecks\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/integralads.com\\\/apac\\\/insider\\\/beat-java-bottlenecks\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/integralads.com\\\/apac\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Beat the Java Bottlenecks\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/integralads.com\\\/#website\",\"url\":\"https:\\\/\\\/integralads.com\\\/\",\"name\":\"Integral Ad Science\",\"description\":\"The Hidden Cost of MFA Webinar\",\"publisher\":{\"@id\":\"https:\\\/\\\/integralads.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/integralads.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-APAC\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/integralads.com\\\/#organization\",\"name\":\"Integral Ad Science\",\"url\":\"https:\\\/\\\/integralads.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-APAC\",\"@id\":\"https:\\\/\\\/integralads.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/integralads.com\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/IAS_Square-Logo-600x600-1.png\",\"contentUrl\":\"https:\\\/\\\/integralads.com\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/IAS_Square-Logo-600x600-1.png\",\"width\":600,\"height\":600,\"caption\":\"Integral Ad Science\"},\"image\":{\"@id\":\"https:\\\/\\\/integralads.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/integralads\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/integralads.com\\\/#\\\/schema\\\/person\\\/dbee79df007713b5bab3127e3f349399\",\"name\":\"IAS TEAM\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-APAC\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/255e04bda9c08f76d15834db86e6d973bed5d92c701c65e4e3781e74f8b79551?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/255e04bda9c08f76d15834db86e6d973bed5d92c701c65e4e3781e74f8b79551?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/255e04bda9c08f76d15834db86e6d973bed5d92c701c65e4e3781e74f8b79551?s=96&d=mm&r=g\",\"caption\":\"IAS TEAM\"},\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\",\"sameAs\":[\"https:\\\/\\\/integralads.com\"],\"jobTitle\":\"TEST\",\"url\":\"https:\\\/\\\/integralads.com\\\/apac\\\/insider\\\/author\\\/ias2023\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Beat the Java Bottlenecks - Integral Ad Science","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:\/\/integralads.com\/apac\/insider\/beat-java-bottlenecks\/","og_locale":"en_US","og_type":"article","og_title":"Beat the Java Bottlenecks","og_description":"The overall performance of an application can be contingent upon a variety of factors, and often performance tuning can be more of an art than a science. While performance can be a secondary benefit in some applications, in high throughput...","og_url":"https:\/\/integralads.com\/apac\/insider\/beat-java-bottlenecks\/","og_site_name":"Integral Ad Science","article_published_time":"2017-12-12T05:00:00+00:00","article_modified_time":"2023-07-12T11:58:57+00:00","author":"IAS TEAM","twitter_card":"summary_large_image","twitter_creator":"@integralads","twitter_site":"@integralads","twitter_misc":{"Written by":"IAS TEAM","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/integralads.com\/apac\/insider\/beat-java-bottlenecks\/#article","isPartOf":{"@id":"https:\/\/integralads.com\/apac\/insider\/beat-java-bottlenecks\/"},"author":{"name":"IAS TEAM","@id":"https:\/\/integralads.com\/#\/schema\/person\/dbee79df007713b5bab3127e3f349399"},"headline":"Beat the Java Bottlenecks","datePublished":"2017-12-12T05:00:00+00:00","dateModified":"2023-07-12T11:58:57+00:00","mainEntityOfPage":{"@id":"https:\/\/integralads.com\/apac\/insider\/beat-java-bottlenecks\/"},"wordCount":1163,"publisher":{"@id":"https:\/\/integralads.com\/#organization"},"articleSection":["Insights"],"inLanguage":"en-APAC"},{"@type":"WebPage","@id":"https:\/\/integralads.com\/apac\/insider\/beat-java-bottlenecks\/","url":"https:\/\/integralads.com\/apac\/insider\/beat-java-bottlenecks\/","name":"Beat the Java Bottlenecks - Integral Ad Science","isPartOf":{"@id":"https:\/\/integralads.com\/#website"},"datePublished":"2017-12-12T05:00:00+00:00","dateModified":"2023-07-12T11:58:57+00:00","breadcrumb":{"@id":"https:\/\/integralads.com\/apac\/insider\/beat-java-bottlenecks\/#breadcrumb"},"inLanguage":"en-APAC","potentialAction":[{"@type":"ReadAction","target":["https:\/\/integralads.com\/apac\/insider\/beat-java-bottlenecks\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/integralads.com\/apac\/insider\/beat-java-bottlenecks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/integralads.com\/apac\/"},{"@type":"ListItem","position":2,"name":"Beat the Java Bottlenecks"}]},{"@type":"WebSite","@id":"https:\/\/integralads.com\/#website","url":"https:\/\/integralads.com\/","name":"Integral Ad Science","description":"The Hidden Cost of MFA Webinar","publisher":{"@id":"https:\/\/integralads.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/integralads.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-APAC"},{"@type":"Organization","@id":"https:\/\/integralads.com\/#organization","name":"Integral Ad Science","url":"https:\/\/integralads.com\/","logo":{"@type":"ImageObject","inLanguage":"en-APAC","@id":"https:\/\/integralads.com\/#\/schema\/logo\/image\/","url":"https:\/\/integralads.com\/wp-content\/uploads\/2023\/10\/IAS_Square-Logo-600x600-1.png","contentUrl":"https:\/\/integralads.com\/wp-content\/uploads\/2023\/10\/IAS_Square-Logo-600x600-1.png","width":600,"height":600,"caption":"Integral Ad Science"},"image":{"@id":"https:\/\/integralads.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/integralads"]},{"@type":"Person","@id":"https:\/\/integralads.com\/#\/schema\/person\/dbee79df007713b5bab3127e3f349399","name":"IAS TEAM","image":{"@type":"ImageObject","inLanguage":"en-APAC","@id":"https:\/\/secure.gravatar.com\/avatar\/255e04bda9c08f76d15834db86e6d973bed5d92c701c65e4e3781e74f8b79551?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/255e04bda9c08f76d15834db86e6d973bed5d92c701c65e4e3781e74f8b79551?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/255e04bda9c08f76d15834db86e6d973bed5d92c701c65e4e3781e74f8b79551?s=96&d=mm&r=g","caption":"IAS TEAM"},"description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","sameAs":["https:\/\/integralads.com"],"jobTitle":"TEST","url":"https:\/\/integralads.com\/apac\/insider\/author\/ias2023\/"}]}},"_links":{"self":[{"href":"https:\/\/integralads.com\/apac\/wp-json\/wp\/v2\/posts\/296996","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/integralads.com\/apac\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/integralads.com\/apac\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/integralads.com\/apac\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/integralads.com\/apac\/wp-json\/wp\/v2\/comments?post=296996"}],"version-history":[{"count":0,"href":"https:\/\/integralads.com\/apac\/wp-json\/wp\/v2\/posts\/296996\/revisions"}],"wp:attachment":[{"href":"https:\/\/integralads.com\/apac\/wp-json\/wp\/v2\/media?parent=296996"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/integralads.com\/apac\/wp-json\/wp\/v2\/categories?post=296996"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/integralads.com\/apac\/wp-json\/wp\/v2\/tags?post=296996"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}