{"id":38287,"date":"2025-10-28T06:33:01","date_gmt":"2025-10-28T10:33:01","guid":{"rendered":"https:\/\/www.eginnovations.com\/blog\/?p=38287"},"modified":"2025-10-28T06:33:01","modified_gmt":"2025-10-28T10:33:01","slug":"scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os","status":"publish","type":"post","link":"https:\/\/www.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/","title":{"rendered":"Scaling Java Web Applications: Choosing Between Microsoft Windows and Linux OS"},"content":{"rendered":"<div class=\"inner_content\">\n<p>Java is one of the most widely used platforms for supporting web applications. According to <a class=\"https:\/\/redmonk.com\/sogrady\/2025\/06\/18\/language-rankings-1-25\/\" href=\"https:\/\/redmonk.com\/sogrady\/2025\/06\/18\/language-rankings-1-25\/\" target=\"blank\">RedMonk<\/a> and <a class=\"link\" href=\"https:\/\/www.techrepublic.com\/article\/tiobe-index-language-rankings\/\" target=\"blank\">TIOBE<\/a> rankings, Java has consistently remained in the top 4 most popular programming languages worldwide, with <a class=\"link\" href=\"https:\/\/tms-outsource.com\/blog\/posts\/java-statistics\/\" target=\"blank\">millions of developers actively using it<\/a>. Industry-standard application servers such as WebLogic, WebSphere, Tomcat, and JBoss all run on Java and power a large share of enterprise workloads and Java web applications.<\/p>\n<p>When you deploy a Java web application, a key decision is the choice of operating system. While Java is platform-independent, the underlying OS still influences performance, scalability, and manageability. Very often, the choice of OS comes down to what technologies the admin team is most comfortable with. In many enterprises and use cases, Windows dominates\u2014as of 2024, Windows Server still accounts for nearly 72% of enterprise server deployments\u2014while Linux adoption continues to grow rapidly (source: <a class=\"link\" href=\"https:\/\/truelist.co\/blog\/linux-statistics\/\" target=\"blank\">Linux Statistics 2025 &#8211; TrueList<\/a>), especially in cloud and container-native environments. However, Linux can be a challenge for those admins who may be more familiar with GUI-based administration in Windows.<\/p>\n<p>In this blog, we will highlight key performance and operational differences between Windows and Linux for supporting Java web applications today. Our analysis is based on a real-world case of troubleshooting a malfunctioning Java web application at a large global enterprise.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Java_Web_Application_Deployment\"><\/span>Java Web Application Deployment<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>We were tasked with optimizing performance and troubleshooting sporadic issues that occurred with a multi-tier web application. Apache Tomcat 10.1 was the web application server and Microsoft SQL 2019 was the database server in use. Both the application server and the database were on dedicated systems running Microsoft Windows Server OS 2019. JDK 17 was the version of Java in use. As the application was accessed by 1000s of remote clients, a redundant cluster of application server and database server pairs was in use. While application performance overall was acceptable, we noticed that every few days some of the application logic failed and there were also synchronization errors between the application servers.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Troubleshooting_Performance_Issues_Trial_and_Error\"><\/span>Troubleshooting Performance Issues: Trial and Error<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The first thing we did was benchmark the system performance of the application server and database. We did not see a large number of connections to the database server and all the key SQL parameters were normal, indicating that there was no bottleneck in the database tier. On the Tomcat application server also, there were no resource bottlenecks (see Figure 1).<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/comparition-report-zoom.jpg\" data-rel=\"lightbox-image-0\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-38471 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/comparition-report.webp\" alt=\"CPU and RAM utilization graphs for the malfunctioning Java Web application showing normal levels of usage\" width=\"750\" height=\"330\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/comparition-report.webp 750w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/comparition-report-300x132.webp 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/comparition-report-310x136.webp 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/comparition-report-140x62.webp 140w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/a><\/p>\n<div class=\"img_caption\">Figure 1: CPU &amp; Memory utilization in the Java web application tier indicating that the server resource usage levels where within acceptable limits<\/div>\n<p>Synthetic application checks configured to run throughout the day every 5 minutes showed availability failures at several times during the day. Analyzing the failures, we could see \u201cConnection Refused\u201d messages on the client \u2013 indicating that the server refused to accept connection requests from the client. To isolate whether the issue was network related or not, we configured the synthetic checks to run from within the server itself. These checks targeted the local address of the server and therefore, would not involve any network communication. Even after this change, we observed availability failures (see Figure 2).<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/web-availability-zoom.jpg\" data-rel=\"lightbox-image-1\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-38473 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/web-availability.webp\" alt=\"Graph showing the uptime and availability of a Java Web Application experiencing problems. The graph shows availability dropping regularly to 0% from 100%\" width=\"750\" height=\"375\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/web-availability.webp 750w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/web-availability-300x150.webp 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/web-availability-310x155.webp 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/web-availability-140x70.webp 140w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/a><\/p>\n<div class=\"img_caption\">Figure 2: 83% Uptime of the application, due to multiple drops in availability monitoring<\/div>\n<p>We then configured the availability checks to target a different port on the application server (one that was not used by the clients). When a dedicated port was used for the synthetic checks, we did not find any availability errors. If the application had been the cause of the bottleneck, we would have seen availability errors even with a dedicated port being used for the synthetic checks. Analysis of the Java web application\u2019s CPU and heap memory usage (see Figure 3) showed no bottlenecks, as expected.<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/JVM-memory-zoom.jpg\" data-rel=\"lightbox-image-2\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-38475 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/JVM-memory.webp\" alt=\"A graph from eG Enterprise console showing JVM heap memory usage. The usage is consistently below the levels (shown) that would trigger an alert\" width=\"750\" height=\"314\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/JVM-memory.webp 750w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/JVM-memory-300x126.webp 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/JVM-memory-310x130.webp 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/JVM-memory-140x59.webp 140w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/a><\/p>\n<div class=\"img_caption\">Figure 3: JVM Heap memory consumption<\/div>\n<table class=\"hand_table_style\" style=\"width: 100%; margin-top: 5px; margin-bottom: 15px;\">\n<tbody>\n<tr>\n<td><img decoding=\"async\" class=\"lazy loaded\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/09\/hand-symbol.png\" alt=\"\" data-src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/09\/hand-symbol.png\" data-was-processed=\"true\" \/><\/td>\n<td>\n<div style=\"line-height: 30px; font-family: 'Graphik-Regular';\">The fact that there were connection drops seen for connections made internal to the server pointed to an issue in the server, rather than somewhere in the network.<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Our analysis indicated that the server OS was a bottleneck. However, a review of the key server resources (CPU, memory, disk, network) did not reveal any issues. We even doubled the capacity of the system \u2013 by doubling the CPU and memory configured \u2013 and that did not stop the application issues from occurring.<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/TCP-zoom.jpg\" data-rel=\"lightbox-image-3\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-38482 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/TCP.webp\" alt=\"A graph from eG Enterprise showing the number of TCP associated with a Java Web Application under investigation\" width=\"1180\" height=\"529\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/TCP.webp 1180w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/TCP-300x134.webp 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/TCP-1024x459.webp 1024w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/TCP-768x344.webp 768w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/TCP-800x359.webp 800w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/TCP-310x139.webp 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/TCP-140x63.webp 140w\" sizes=\"auto, (max-width: 1180px) 100vw, 1180px\" \/><\/a><\/p>\n<div class=\"img_caption\">Figure 4: Number of TCP connections established on the server over time<\/div>\n<p>A common reason for connection refused errors is over utilization of ephemeral TCP ports on a server. Analysis of TCP connections in different stages indicated that at no time was the server seeing more than 3000 connections in different states, with less than 400 TCP connections established at most times (see Figure 4), whereas the total limit of ephemeral ports was configured to 49000. Hence, the server was not reaching the TCP ephemeral ports limit either. Yet connections were being refused periodically.<\/p>\n<div class=\"alignright box\">\n<div style=\"padding: 20px; border: 1px solid #ffd392; background: #fcf8ef; text-align: justify; margin-bottom: 20px;\">\n<p style=\"font-size: 20px; font-weight: bold; margin-bottom: 15px;\">What are TCP Ephemeral Ports?<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-38505\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/TCP_Ephermal-4.png\" alt=\"\" width=\"356\" height=\"77\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/TCP_Ephermal-4.png 356w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/TCP_Ephermal-4-300x65.png 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/TCP_Ephermal-4-310x67.png 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/TCP_Ephermal-4-140x30.png 140w\" sizes=\"auto, (max-width: 356px) 100vw, 356px\" \/>A TCP ephemeral port is a temporary, automatically assigned port number that a client machine uses to establish a connection with a server. Unlike well-known server ports (like 80 for HTTP), ephemeral ports are dynamic, short-lived, and used only for the duration of a single communication session, after which they become available for reuse. These ports are essential for enabling client-to-server communication by providing a unique, temporary endpoint for each outgoing connection, preventing conflicts and allowing for multiple simultaneous connections.<\/p>\n<\/div>\n<\/div>\n<p>We proceeded to disable all the security software on the system, but the application connection availability errors continued.<\/p>\n<p style=\"margin-bottom: 15px;\">Further application and OS tuning was attempted:<\/p>\n<ul>\n<li>Tomcat\u2019s heap memory was increased with no effect.<\/li>\n<li>Tomcat\u2019s accept queue is often seen as a bottleneck. We increased the acceptCount of Tomcat several times \u2013 to 10,000+ connections to no avail.<\/li>\n<li>We changed a number of Windows registry entries relating to TCP connections (in HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters) including TcpNumConnections, TcpTimedWaitDelay and SynAttackProtect values (see <a class=\"link\" href=\"https:\/\/learn.microsoft.com\/en-us\/answers\/questions\/495615\/how-to-set-to-allow-maximumtcp-connection-in-windo\" target=\"blank\">https:\/\/learn.microsoft.com\/en-us\/answers\/questions\/495615\/how-to-set-to-allow-maximumtcp-connection-in-windo<\/a>) but this did not help.<\/li>\n<\/ul>\n<p>The evidence though still indicated that the problem was related to TCP connection handling on the server.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Narrowing_Down_the_Cause_of_the_Problem\"><\/span>Narrowing Down the Cause of the Problem<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p style=\"text-align: left;\">To narrow down the cause of the problem, we simulated a similar environment. We created a client utility that created a given number of simultaneous TCP connections using multiple parallel threads. During our testing, we noticed if there were 200 connections or less, there were no connection refused errors. When the number of simultaneous connections attempted increased beyond 200, we saw some connection refused errors. As the number of connections increased, so did the errors. It turns out the limit of 200 connections is imposed by the Windows OS (Windows server OS has a limit of 200, client OS has a limit of 5 \u2013 see <a class=\"link\" href=\"https:\/\/docs.sockettools.com\/v11\/activex\/tcpsrv\/control\/property\/backlog.html\" target=\"blank\">https:\/\/docs.sockettools.com\/v11\/activex\/tcpsrv\/control\/property\/backlog.html<\/a>).<\/p>\n<div style=\"padding: 20px; border: 1px solid #ffd392; background: #fcf8ef; text-align: justify; margin-bottom: 30px;\">\n<p style=\"font-size: 20px; font-weight: bold; margin-bottom: 15px;\">What is the TCP backlog queue?<\/p>\n<p style=\"margin-bottom: 15px;\">When a client initiates a TCP connection to a server, the server&#8217;s TCP layer places the connection request in the backlog queue.<\/p>\n<p style=\"margin-bottom: 5px;\">Max backlog queue length is the maximum number of pending TCP connection requests that the operating system will queue for a server application before it starts rejecting new connection attempts. This backlog queue is used to manage incoming connection requests while the server is busy processing other connections.<\/p>\n<\/div>\n<p style=\"text-align: left;\">The Windows OS provides a way for applications to provide it a hint to set the maximum size of the backlog queue \u2013 see <a class=\"link\" href=\"https:\/\/blogs.msdn.microsoft.com\/winsdk\/2015\/06\/01\/winsocks-listen-backlog-offers-more-flexibility-in-windows-8\" target=\"blank\">https:\/\/blogs.msdn.microsoft.com\/winsdk\/2015\/06\/01\/winsocks-listen-backlog-offers-more-flexibility-in-windows-8<\/a> and <a class=\"link\" href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/winsock2\/nf-winsock2-listen\" target=\"blank\">https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/winsock2\/nf-winsock2-listen<\/a>.<\/p>\n<p>Analyzing this further, we came across a recent Java bug relating to TCP connection handling. See <a class=\"link\" href=\"https:\/\/mail.openjdk.org\/pipermail\/net-dev\/2025-June\/027261.html\" target=\"blank\">RFR: 8330940: Impossible to create a socket backlog greater than 200 on Windows 8+<\/a>. When a Java program listens on a TCP port, it can provide a backlog queue length to the listen call. On Windows, when an application provides a larger backlog queue in the Socket listen call, Java ignores this \u2013 therein lies the bug. So, if at any time, more than 200 connections are in the half open stage (between SYN start and connection establishment), the Windows OS will refuse these connections. Clients see errors when this happens.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Why_is_this_Important\"><\/span>Why is this Important?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Many client applications are designed assuming connections to remote applications will work \u2013 i.e., without a failover mechanism. Such applications will see abnormal behavior when TCP connections are refused and the application logic may fail (e.g., a regularly scheduled compliance report may not be created and saved, two applications may be out of sync, resulting in inconsistencies, etc.). Furthermore, in this situation, an application is not completely unavailable \u2013 some connections will succeed and others might fail. To handle such situations, review your Java web application code and ensure that you have failover\/retry mechanisms in place to gracefully handle situations when TCP connections are refused by the remote server.<\/p>\n<p>The fact that even when a server is lightly loaded, TCP connections can be refused by the server is confusing. Java\/JDK 26 in an early release fixes the issue \u2013 see <a class=\"link\" href=\"https:\/\/jdk.java.net\/26\/\" target=\"blank\">OpenJDK JDK 26 Early-Access Builds<\/a>. This fix is not available in any other versions of Java at this time.<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/white-paper\/how-to-get-full-stack-visibility-for-your-java-applications\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-38486 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/full-stack-banner.jpg\" alt=\"Clickable banner to a download page for a free whitepaper on how to monitor Java applications\" width=\"850\" height=\"180\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/full-stack-banner.jpg 850w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/full-stack-banner-300x64.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/full-stack-banner-768x163.jpg 768w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/full-stack-banner-800x169.jpg 800w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/full-stack-banner-310x66.jpg 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/09\/full-stack-banner-140x30.jpg 140w\" sizes=\"auto, (max-width: 850px) 100vw, 850px\" \/><\/a><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Linux_vs_Windows_OS_for_Java_Web_Applications\"><\/span>Linux vs. Windows OS for Java Web Applications<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>We have tested the same application with Apache Tomcat running on Linux OS and a similar load. The default TCP backlog queue length on Linux is 4096. Furthermore, Java on Linux currently handles the TCP backlog queue more efficiently than it does on Windows. Even when there are over 3000+ simultaneous connections incoming to the server, Apache Tomcat on Linux does not refuse any incoming connections. This results in significantly improved performance. Hence, until Java 26 is generally available, you could consider deploying your Java application servers on Linux OS to avoid the performance issues we encountered.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Lessons_Learned\"><\/span>Lessons Learned<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>If you have Java web applications handling high load, Linux is the preferred platform currently.<\/li>\n<li>Ensure that you have end-to-end monitoring in place to get complete visibility into your application\u2019s performance. Ruling out which areas or tiers are not bottlenecks is important in the triage process.<\/li>\n<li>Even with monitoring in place, you may need to be innovative and reconfigure some of the health checks to narrow down what the cause of the problem is.<\/li>\n<li>Applications need to be designed with retry mechanisms in place, otherwise sporadic communication failures can lead to unexpected user experience issues.<\/li>\n<\/ul>\n<div class=\"containers mb-4\" style=\"clear:both\">\n \t<div class=\"fixed-free-trial-div mb-3\" id=\"fixedsectioninfo_blog_btn\">\n \t\n \t<style>.containers_hide_row,.all_blogs_bottom{\n \tdisplay:none;\n   \n}\t<\/style>\n                <div class=\"box-style container row pt-4 pb-4  animatedParent animateOnce\" data-sequence=\"100\" style=\"border-bottom: 1px solid #ddd;border-top: 1px solid #ddd;background: #4b4b4b;padding: 15px 15px 0 15px;border-radius: 12px;\">\n                \n                <div class=\"text-center animated fadeIn go\"> \n                <p class=\"text-center mb-4\" style=\"    color: #fff;\">\n\neG Enterprise is an Observability solution for Modern IT. Monitor digital workspaces, <br\/>web applications, SaaS services, cloud and containers from a single pane of glass.\n<\/p>\n                <\/div>\n                    <div class=\"text-center pb-1 animated fadeIn go\" data-id=\"8\">\n                        <a class=\"border-btnhead-eg\"  href=\"https:\/\/www.eginnovations.com\/it-monitoring\/free-trial\"> <span style=\"font-family: GraphikMedium!important;color: #fff;\">Free Trial<\/span><\/a>\n                        <a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/java-performance-monitoring\" class=\" border-btnhead-eg\" style=\"width:230px;   \"> <svg width=\"24\" height=\"24\" style=\"margin-top:-3px\" version=\"1.1\" id=\"Layer_1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" x=\"0px\" y=\"0px\"\n\t viewBox=\"0 0 26.5 26.5\" style=\"enable-background:new 0 0 26.5 26.5;\" xml:space=\"preserve\">\n<style type=\"text\/css\">\n\t.st2{fill:#fff !important;stroke:#fff !important;stroke-miterlimit:10;}\n\t\n\t\t.border-btnhead:hover .st2 {\n  fill: #ffffff !important;\n  stroke: #ffffff;\n}\n<\/style>\n<g>\n\t<g>\n\t\t<path class=\"st2\" d=\"M13.3,25.8c-6.9,0-12.5-5.6-12.5-12.5S6.4,0.8,13.3,0.8s12.5,5.6,12.5,12.5S20.2,25.8,13.3,25.8z M13.3,1.8\n\t\t\tC6.9,1.8,1.8,6.9,1.8,13.3S7,24.8,13.3,24.8s11.5-5.2,11.5-11.5S19.6,1.8,13.3,1.8z M11.2,18.1c-0.2,0-0.4-0.1-0.6-0.2\n\t\t\tc-0.3-0.2-0.6-0.6-0.6-1V9.7c0-0.4,0.2-0.8,0.6-1c0.3-0.2,0.8-0.2,1.2,0l6.2,3.6c0.3,0.2,0.6,0.6,0.6,1s-0.2,0.8-0.6,1l-6.2,3.6\n\t\t\tC11.6,18,11.4,18.1,11.2,18.1z\"\/>\n\t<\/g>\n<\/g>\n<\/svg> <span style=\"font-family: GraphikMedium!important;color: #fff;\">&nbsp;See the platform<\/span><\/a>\n                    <\/div>\n                <\/div>\n                \n                 <\/div>\n            <\/div>\n<h2><span class=\"ez-toc-section\" id=\"For_further_reading\"><\/span>For further reading:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p style=\"margin-bottom: 15px;\">You may like to read some third-party articles around TCP connections, see:<\/p>\n<ul>\n<li><a class=\"link\" href=\"https:\/\/www.alibabacloud.com\/blog\/tcp-syn-queue-and-accept-queue-overflow-explained_599203\" target=\"blank\">TCP SYN Queue and Accept Queue Overflow Explained<\/a><\/li>\n<li><a class=\"link\" href=\"https:\/\/arthurchiao.art\/blog\/tcp-listen-a-tale-of-two-queues\/\" target=\"blank\">TCP Socket Listen: A Tale of Two Queues (2022)<\/a><\/li>\n<li><a class=\"link\" href=\"https:\/\/medium.com\/@solankerahman\/a-backend-engineers-guide-to-tcp-connections-part-1-10ccccfb8c6e\" target=\"blank\">A Backend Engineer\u2019s guide to TCP Connections<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Java is one of the most widely used platforms for supporting web applications. According to RedMonk and TIOBE rankings, Java has consistently remained in the top 4 most popular programming languages worldwide, with millions of developers actively using it. Industry-standard application servers such as WebLogic, WebSphere, Tomcat, and JBoss all run on Java and power [&hellip;]<\/p>\n","protected":false},"author":52,"featured_media":38597,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"_lmt_disableupdate":"no","_lmt_disable":"","footnotes":""},"categories":[27],"tags":[629,588,171,173,174,2374,292,453],"class_list":["post-38287","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java-monitoring","tag-apm-tools","tag-application-performance-monitoring-tools","tag-java","tag-java-application-monitoring","tag-java-application-performance","tag-java-web-application","tag-web-application-monitoring","tag-web-application-performance"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Scaling Java Web Applications: Choosing Between Microsoft Windows and Linux OS | eG Innovations<\/title>\n<meta name=\"description\" content=\"A deep dive troubleshooting TCP connection issues in a Java web application that behave differently on Windows and Linux OSs. Learn about the implications of OS choice on Java scalability.\" \/>\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.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Scaling Java Web Applications: Choosing Between Microsoft Windows and Linux OS | eG Innovations\" \/>\n<meta property=\"og:description\" content=\"A deep dive troubleshooting TCP connection issues in a Java application that behave differently on Windows and Linux OSs. Learn about the implications of OS choice on Java scalability.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/\" \/>\n<meta property=\"og:site_name\" content=\"eG Innovations\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/eGInnovations\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-28T10:33:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/10\/java-scale-Social-Banner.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Pandian Ramaiah\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@eginnovations\" \/>\n<meta name=\"twitter:site\" content=\"@eginnovations\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Pandian Ramaiah\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Scaling Java Web Applications: Choosing Between Microsoft Windows and Linux OS | eG Innovations","description":"A deep dive troubleshooting TCP connection issues in a Java web application that behave differently on Windows and Linux OSs. Learn about the implications of OS choice on Java scalability.","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.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/","og_locale":"en_US","og_type":"article","og_title":"Scaling Java Web Applications: Choosing Between Microsoft Windows and Linux OS | eG Innovations","og_description":"A deep dive troubleshooting TCP connection issues in a Java application that behave differently on Windows and Linux OSs. Learn about the implications of OS choice on Java scalability.","og_url":"https:\/\/www.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/","og_site_name":"eG Innovations","article_publisher":"https:\/\/www.facebook.com\/eGInnovations","article_published_time":"2025-10-28T10:33:01+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/10\/java-scale-Social-Banner.jpg","type":"image\/jpeg"}],"author":"Pandian Ramaiah","twitter_card":"summary_large_image","twitter_creator":"@eginnovations","twitter_site":"@eginnovations","twitter_misc":{"Written by":"Pandian Ramaiah","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/#article","isPartOf":{"@id":"https:\/\/www.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/"},"author":{"name":"Pandian Ramaiah","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/person\/dded8a1e0ec6d8de4e30022c1c2f9c37"},"headline":"Scaling Java Web Applications: Choosing Between Microsoft Windows and Linux OS","datePublished":"2025-10-28T10:33:01+00:00","mainEntityOfPage":{"@id":"https:\/\/www.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/"},"wordCount":1724,"publisher":{"@id":"https:\/\/www.eginnovations.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/#primaryimage"},"thumbnailUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/10\/java-scale-Thumbnail-banner.jpg","keywords":["APM Tools","Application Performance Monitoring Tools","Java","Java Application Monitoring","Java Application Performance","Java Web Application","Web Application Monitoring","Web Application Performance"],"articleSection":["Java Monitoring"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/","url":"https:\/\/www.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/","name":"Scaling Java Web Applications: Choosing Between Microsoft Windows and Linux OS | eG Innovations","isPartOf":{"@id":"https:\/\/www.eginnovations.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/#primaryimage"},"image":{"@id":"https:\/\/www.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/#primaryimage"},"thumbnailUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/10\/java-scale-Thumbnail-banner.jpg","datePublished":"2025-10-28T10:33:01+00:00","description":"A deep dive troubleshooting TCP connection issues in a Java web application that behave differently on Windows and Linux OSs. Learn about the implications of OS choice on Java scalability.","breadcrumb":{"@id":"https:\/\/www.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/#primaryimage","url":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/10\/java-scale-Thumbnail-banner.jpg","contentUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2025\/10\/java-scale-Thumbnail-banner.jpg","width":362,"height":235},{"@type":"BreadcrumbList","@id":"https:\/\/www.eginnovations.com\/blog\/scaling-java-web-applications-choosing-between-microsoft-windows-and-linux-os\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.eginnovations.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Scaling Java Web Applications: Choosing Between Microsoft Windows and Linux OS"}]},{"@type":"WebSite","@id":"https:\/\/www.eginnovations.com\/blog\/#website","url":"https:\/\/www.eginnovations.com\/blog\/","name":"eG Innovations","description":"IT Performance Monitoring Insights","publisher":{"@id":"https:\/\/www.eginnovations.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.eginnovations.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.eginnovations.com\/blog\/#organization","name":"eG Innovations","alternateName":"eg innovations","url":"https:\/\/www.eginnovations.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2014\/07\/eg-logo-dark-gray1_new.jpg","contentUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2014\/07\/eg-logo-dark-gray1_new.jpg","width":362,"height":235,"caption":"eG Innovations"},"image":{"@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/eGInnovations","https:\/\/x.com\/eginnovations"]},{"@type":"Person","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/person\/dded8a1e0ec6d8de4e30022c1c2f9c37","name":"Pandian Ramaiah","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/48ab64611d2e72e9aba583ecdcfcb8c1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/48ab64611d2e72e9aba583ecdcfcb8c1?s=96&d=mm&r=g","caption":"Pandian Ramaiah"},"url":"https:\/\/www.eginnovations.com\/blog\/author\/pandian\/"}]}},"modified_by":"eG Innovations","_links":{"self":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/posts\/38287","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/users\/52"}],"replies":[{"embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/comments?post=38287"}],"version-history":[{"count":0,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/posts\/38287\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/media\/38597"}],"wp:attachment":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/media?parent=38287"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/categories?post=38287"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/tags?post=38287"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}