Optimizing Your Ubuntu Hosting: Installing Java JRE for Application Performance

Optimizing Your Ubuntu Hosting: Installing Java JRE for Application Performance

For businesses and developers relying on Java-based applications, deploying them efficiently on a Ubuntu server is a fundamental step. Whether you’re running microservices with Spring Boot, managing a backend with Apache Tomcat, or orchestrating data pipelines with Apache Kafka, the Java Runtime Environment (JRE) is the engine that powers these critical components. However, merely installing Java isn’t enough; understanding the nuances of JRE versions, performance implications, and security best practices within a hosting context is paramount. A misconfigured JRE can lead to sluggish application performance, compatibility issues, and even significant security vulnerabilities, directly impacting user experience, operational costs, and your business’s bottom line. This article provides practical, actionable guidance for installing and managing JRE on Ubuntu, specifically tailored for those actively evaluating and implementing hosting solutions.

Understanding Java Runtimes in a Hosting Environment

The Java Runtime Environment (JRE) is the software layer that allows you to run Java applications. It includes the Java Virtual Machine (JVM), core classes, and supporting files. For server-side applications, the JRE isn’t just a dependency; it’s a foundational element that dictates how your application interacts with the underlying operating system and hardware resources provided by your hosting provider. From web servers and application servers to robust enterprise systems and real-time data processing engines, these tools rely heavily on a correctly installed and configured JRE.

The choice and management of your JRE become particularly important when you consider different hosting technologies. On a Virtual Private Server (VPS), where resources are shared but isolated, an optimized JRE installation helps conserve memory and CPU cycles. On a dedicated server, you have full control over the environment, allowing for highly specific JRE tunings that can squeeze out maximum performance. Cloud hosting platforms often offer managed services that abstract away some of these concerns, but understanding the underlying JRE behavior remains crucial for troubleshooting and advanced optimization.

OpenJDK vs. Oracle JRE: A Critical Choice for Your Server

When selecting a Java runtime for your Ubuntu server, the primary decision often revolves around OpenJDK and Oracle JRE. While both serve the same fundamental purpose, their licensing, support models, and deployment implications differ significantly.

OpenJDK

  • Performance: OpenJDK, the open-source reference implementation of Java, offers performance generally comparable to Oracle JRE for most applications. Continuous community development often includes optimizations that align well with modern Linux server environments.
  • Security: Backed by a vast, active community and major contributors like Red Hat, Azul, and Amazon, OpenJDK receives regular security updates and patches, ensuring a robust and secure runtime for your applications.
  • Cost: Being completely free and open source, OpenJDK eliminates licensing costs, making it a highly attractive option for startups, small businesses, and large enterprises looking to manage operational expenses without compromising quality.
  • Scalability: Its open-source nature and compatibility with various Linux distributions make OpenJDK ideal for highly scalable environments, including containerized deployments with Docker and Kubernetes, where rapid provisioning and de-provisioning are common.
  • Ease of Management: OpenJDK is readily available through Ubuntu’s standard APT package manager. This simplifies installation, updates, and overall lifecycle management, integrating smoothly with existing system administration workflows.
  • Recommended Use Cases: Most modern enterprise applications, microservices architectures, open-source projects, and any organization prioritizing cost efficiency, flexibility, and community-driven support.

Oracle JRE

  • Performance: Historically, Oracle JRE was perceived to have a performance edge in certain specific benchmarks or niche scenarios. However, with the evolution of OpenJDK, this gap has largely diminished, and for many real-world applications, the difference is negligible.
  • Security: Oracle provides proprietary updates and enterprise-grade support for its JRE, often under commercial licenses. This can be appealing for organizations with strict vendor support requirements or those deeply integrated into Oracle’s ecosystem.
  • Cost: Oracle JRE comes with a commercial license for production use in many scenarios, which can incur significant costs, especially for large-scale deployments or applications that directly interact with Oracle products. This requires careful consideration of your budget and legal obligations.
  • Scalability: While technically capable of scaling, the licensing model of Oracle JRE can introduce complexities and cost implications in highly elastic cloud environments where instances are frequently spun up and down.
  • Ease of Management: Installation of Oracle JRE often involves manual downloads from Oracle’s website and separate package management, which can be less streamlined than using Ubuntu’s package manager for OpenJDK. Tracking licenses also adds an administrative burden.
  • Recommended Use Cases: Legacy applications that were specifically certified and developed against Oracle JRE, environments with existing substantial Oracle ecosystem dependencies, or organizations where proprietary vendor support is a non-negotiable requirement due to internal policies or regulatory compliance.

Real-World Implementation Example: Deploying a Spring Boot Application

Let’s consider a practical scenario. “DataFlow Analytics,” a burgeoning startup, needs to deploy a critical real-time data processing API, built with Spring Boot, onto a Ubuntu VPS. Their primary challenge is achieving optimal performance and stability for their API, which handles high-volume data streams, while keeping operational costs manageable. They’ve chosen a Ubuntu 22.04 LTS VPS from a reputable hosting provider for its balance of control and cost-effectiveness. Here’s how they approach the JRE installation and application deployment:

  1. Choosing the Right Ubuntu Server Instance: DataFlow Analytics carefully selects a VPS with sufficient CPU and RAM. For their anticipated moderate load, they opt for a 4GB RAM, 2vCPU instance. This ensures enough headroom for the JVM and their Spring Boot application, preventing performance bottlenecks under typical usage.
  2. Initial Server Setup and Access:

    First, they establish a secure SSH connection to their new Ubuntu VPS. Before any installations, they update the system’s package lists to ensure they’re fetching the latest software information:

    sudo apt update

  3. Installing OpenJDK JRE (Recommended for Servers):

    Given the startup’s focus on cost-efficiency and flexibility, they choose OpenJDK 17 LTS (Long-Term Support) for its stability and long-term support. Specifically, they install the `jre-headless` version, which is optimized for server environments by excluding graphical components, thereby saving resources.

    sudo apt install openjdk-17-jre-headless

    After installation, they verify the Java version to confirm everything is correctly set up:

    java -version

    Expected output looks similar to:

    openjdk version "17.0.x" 202x-xx-xx
    OpenJDK Runtime Environment (build 17.0.x+x-Ubuntu-1ubuntu22.04)
    OpenJDK 64-Bit Server VM (build 17.0.x+x-Ubuntu-1ubuntu22.04, mixed mode, sharing)

  4. Configuring Environment Variables (Good Practice for Robustness):

    While not strictly necessary for simple `java -jar` commands, setting `JAVA_HOME` explicitly is a best practice for complex deployments or when other tools need to locate the Java installation. They add this to their `/etc/environment` file for system-wide availability:

    echo 'JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"' | sudo tee -a /etc/environment
    source /etc/environment

  5. Deploying the Spring Boot JAR:

    The compiled Spring Boot application is a single executable JAR file. DataFlow Analytics uses `scp` or a similar secure file transfer method to upload their `dataflow-analytics-api.jar` to a dedicated directory, for instance, `/opt/dataflow-api/`.

    sudo mkdir /opt/dataflow-api
    sudo chown <your-user>:<your-user> /opt/dataflow-api
    scp dataflow-analytics-api.jar <your-user>@<your-server-ip>:/opt/dataflow-api/

  6. Creating a Systemd Service for Reliable Operation:

    To ensure the application runs reliably in the background, starts automatically on server boot, and restarts if it crashes, they configure it as a systemd service. They create a service file `/etc/systemd/system/dataflow-api.service`:

    [Unit]Description=DataFlow Analytics API
    After=network.target

    [Service]User=dataflow
    WorkingDirectory=/opt/dataflow-api
    ExecStart=/usr/bin/java -Xmx1024m -jar dataflow-analytics-api.jar
    SuccessExitStatus=143
    Restart=always
    RestartSec=10

    [Install]WantedBy=multi-user.target

    They also create a dedicated system user `dataflow` to run the application, adhering to the principle of least privilege. After creating the file, they reload systemd and start/enable the service:

    sudo useradd --no-create-home --shell /bin/false dataflow
    sudo chown dataflow:dataflow /opt/dataflow-api/dataflow-analytics-api.jar
    sudo systemctl daemon-reload
    sudo systemctl start dataflow-api
    sudo systemctl enable dataflow-api

  7. Firewall Configuration:

    The Spring Boot API listens on port 8080 by default. They use UFW (Uncomplicated Firewall) to allow traffic only on necessary ports:

    sudo ufw allow OpenSSH
    sudo ufw allow 8080/tcp
    sudo ufw enable

  8. Monitoring:

    DataFlow Analytics implements basic monitoring using `sudo systemctl status dataflow-api` and reviewing logs (`journalctl -u dataflow-api.service -f`). They also plan to integrate more advanced JVM monitoring tools as their platform scales.

Navigating Common Deployment Mistakes for Java on Ubuntu

Deploying Java applications effectively on Ubuntu servers goes beyond just running a few commands. Many pitfalls can lead to performance issues, instability, or even security risks. Understanding and avoiding these common mistakes is critical for any operational environment.

  • Incorrect JRE Version and Compatibility:

    A frequent error is attempting to run a Java application compiled with a newer JDK (e.g., Java 17) on an older JRE (e.g., Java 8), resulting in an `UnsupportedClassVersionError`. Conversely, running an older application on a much newer JRE might introduce subtle compatibility issues, even if it “works.”

    Practical Tip: Always consult your application’s documentation for its required or recommended Java version. For environments needing multiple Java versions, utilize Ubuntu’s `update-java-alternatives` system or explicitly set the `JAVA_HOME` environment variable within application-specific startup scripts (like systemd service files) to ensure the correct JRE is used for each application.

  • Installing the Full JDK or a Non-Headless JRE on a Server:

    Developers often install the full Java Development Kit (JDK) on their local machines, which includes compilers and development tools. If this is replicated on a production server, or if a JRE with GUI components is installed, it consumes unnecessary disk space, memory, and increases the attack surface, impacting server efficiency.

    Practical Tip: For server environments, prioritize installing the `jre-headless` variants (e.g., `openjdk-17-jre-headless`). These minimal runtimes are designed for backend processes without a graphical interface, reducing resource footprint and enhancing security.

  • Ignoring Resource Allocation and JVM Memory Settings:

    Java applications, particularly those handling large datasets or high concurrency, are notoriously memory-hungry. Failing to allocate sufficient RAM to the server or neglecting to configure JVM heap sizes (`-Xmx`, `-Xms`) can lead to frequent `OutOfMemoryError` exceptions, excessive garbage collection, or slow application performance.

    Practical Tip: Begin by monitoring your Java application’s memory usage with tools like `htop`, `jstat`, or `jvisualvm` (locally). Configure the JVM’s maximum heap size (`-Xmx`) to prevent it from consuming all available RAM, but ensure it’s large enough for your application’s workload. Balance this with the total server memory. If running on a VPS, choose a plan with adequate RAM for both the OS and your application.

  • Insecure Default Configurations:

    Running Java applications as the `root` user, leaving default application ports open to the entire internet, or not configuring proper permissions for application directories are common security oversights.

    Practical Tip: Always adhere to the principle of least privilege. Create dedicated, unprivileged system users to run your Java applications. Implement robust firewall rules (using `ufw` on Ubuntu) to restrict access to application-specific ports (e.g., 8080) to only necessary IP addresses or internal networks. If exposing to the internet, use a reverse proxy like Nginx or Apache with SSL/TLS encryption.

  • Lack of Persistent Application Management:

    Manually starting a Java JAR file (e.g., `java -jar my-app.jar`) means the application will terminate if the SSH session closes or if the application crashes, leading to unexpected downtime.

    Practical Tip: Always configure your Java applications as system services using `systemd` (as shown in the real-world example) or other process managers like Supervisor. This ensures the application starts automatically on boot, runs persistently in the background, and automatically restarts upon failure, significantly enhancing reliability and operational stability.

Performance and Security Considerations for Java Applications on Ubuntu Servers

Beyond initial installation, the ongoing performance and security of your Java applications on Ubuntu servers demand continuous attention. These factors directly influence user experience, data integrity, and compliance.

Optimizing Java Application Performance

Performance tuning for Java applications is a multifaceted discipline, heavily influenced by both the JRE configuration and the underlying server hardware:

  • JVM Flags for Memory and Garbage Collection: The JVM offers a plethora of flags to fine-tune its behavior. Key flags include:
    • -Xmx and -Xms: These set the maximum and initial heap sizes, respectively. Properly configuring these prevents excessive garbage collection or out-of-memory errors. It’s often beneficial to set them to the same value to reduce heap resizing overhead.
    • Garbage Collector (GC) Selection: Modern JVMs offer several GC algorithms (e.g., G1GC, ParallelGC, Shenandoah, ZGC). G1GC is a common default for server-side applications, offering a good balance between throughput and pause times. Experimenting with different GCs based on your application’s memory allocation patterns can yield significant performance gains. For instance, high-throughput batch processing might benefit from ParallelGC, while low-latency microservices might explore ZGC or Shenandoah.
  • Hardware Alignment: The choice of hosting hardware directly impacts Java application performance.
    • CPU: Java applications often perform well on CPUs with high clock speeds for single-threaded tasks and a generous number of cores for highly concurrent, multi-threaded workloads. Consider the specific workload profile when selecting a VPS or dedicated server.
    • RAM: Adequate RAM is critical for the JVM heap and other OS processes. Insufficient RAM leads to excessive swapping to disk, drastically slowing down performance.
    • Disk I/O: For Java applications that frequently read or write data (e.g., logging, database interactions, file processing), fast disk I/O is crucial. Utilizing SSD offshore hosting can dramatically improve performance compared to traditional HDDs, especially for I/O-intensive Java applications like data analytics engines or content management systems.

Enhancing Java Application Security

Security is not a one-time setup but an ongoing process. For Java applications on Ubuntu, a layered approach is most effective:

  • Regular Updates: Keep your JRE and Ubuntu operating system packages current. Regular `sudo apt update && sudo apt upgrade` commands ensure you receive the latest security patches for both Java and the underlying OS, protecting against known vulnerabilities.
  • Principle of Least Privilege: As mentioned, run your Java applications using dedicated, unprivileged system users. This prevents a compromised application from gaining root access or interfering with other system components.
  • Robust Firewall Rules (UFW): Configure the Uncomplicated Firewall (UFW) on Ubuntu to allow traffic only on the specific ports your Java application needs (e.g., 8080, 443 for HTTPS). Block all other incoming ports by default. For example, if your application communicates with an internal database on a specific port, ensure only your application server can reach that port.
  • Vulnerability Scanning and Dependency Management: Modern Java applications often rely on numerous third-party libraries. Integrate tools like OWASP Dependency-Check or Snyk into your CI/CD pipeline to automatically scan your project’s dependencies for known vulnerabilities. Regularly update libraries to their secure versions.
  • Secure Configuration: Harden your Ubuntu server beyond the JRE. Disable unnecessary services, implement strong SSH configurations (disable password authentication, use key-based authentication), and regularly review system logs for suspicious activity.

When This Hosting Solution Is Not the Right Choice

While installing Java JRE on Ubuntu offers immense flexibility and power for a wide range of applications, it’s not a universal panacea. There are specific scenarios where this approach might be suboptimal, or even entirely inappropriate, impacting efficiency and cost-effectiveness.

  • Extremely Low Resource or Static Websites: If your hosting needs are limited to a simple static website, a basic HTML/CSS blog, or a brochure site with minimal dynamic content, deploying a full JRE on Ubuntu would be overkill. The overhead of the JVM, even in a headless configuration, consumes more memory and CPU than necessary. For such cases, shared hosting or a basic budget offshore hosting plan using lighter technologies like Nginx or Apache for static content would be far more cost-effective and simpler to manage.
  • Specialized Workloads Requiring Other Runtimes: Your application might be built on a different technology stack entirely. For instance, if you’re deploying a .NET Core application, a Windows Server environment might be more native and efficient, or a specific Linux distribution optimized for .NET Core might be a better fit. Similarly, highly optimized C++ applications or those tied to proprietary, non-JVM runtimes would not benefit from a Java installation.
  • Strict, Complex Legacy Oracle JRE License Requirements: While most new Java development favors OpenJDK, some legacy enterprise applications might be strictly certified and licensed only for specific, older versions of Oracle JRE. Navigating the commercial licensing terms for server deployments can be complex and expensive. In such niche cases, you might need a different hosting strategy, or a thorough legal review to ensure compliance, potentially making the standard Ubuntu/OpenJDK path less straightforward.
  • Purely Client-Side Java Applets (Deprecated): Historically, Java applets ran in web browsers. However, this technology is largely deprecated due to security concerns and browser support changes. If your “Java application” refers exclusively to such client-side components, a server-side JRE installation isn’t directly relevant to its execution.
  • Managed Application Hosting Solutions: Many cloud providers offer fully managed application hosting platforms (e.g., AWS Elastic Beanstalk, Google App Engine, Azure App Service, Heroku). These services abstract away the operating system and runtime management, including JRE installation and configuration. While you still deploy Java code, the specific task of installing JRE on Ubuntu becomes irrelevant as it’s handled by the platform itself. If your team prefers a hands-off approach to infrastructure, a managed service might be a better fit than a self-managed Ubuntu VPS.

Practical Recommendations for Deploying Java on Ubuntu

Navigating the landscape of Java deployments on Ubuntu requires tailoring your approach to your specific business needs and technical capabilities. Here are practical recommendations for different organizational profiles:

For Startups and Small Businesses

  • Embrace OpenJDK: Start with an OpenJDK Long-Term Support (LTS) version like 11 or 17. Its open-source nature, robust community support, and lack of licensing fees align perfectly with startup budgets and agility.
  • Leverage vps hosting: A Virtual Private Server (VPS) offers a sweet spot between cost and control. A netherlands vps, for example, is an excellent choice for businesses targeting European audiences, offering good network latency and adherence to strong data privacy regulations, or even general businesses looking for robust infrastructure. Scale your VPS resources (CPU, RAM) incrementally as your application’s demands grow.
  • Automate Installation: Use basic shell scripts or configuration management tools like Ansible to automate JRE installation and application deployment. This reduces manual errors and speeds up server provisioning, crucial for rapid iteration.
  • Consider Initial Budget Options: For non-critical internal tools, staging environments, or initial proofs-of-concept, explore cheap offshore hosting options. While these plans might come with certain trade-offs in terms of premium support or geographical proximity, they can offer significant cost savings during early development phases.

For Enterprise Applications

  • Standardize on LTS OpenJDK: Mandate a specific OpenJDK LTS version across all development, staging, and production environments. This ensures consistency, simplifies support, and reduces compatibility issues.
  • Containerization and Orchestration: For enterprise-grade reliability and scalability, containerize your Java applications using Docker and orchestrate them with Kubernetes. This abstracts the JRE installation into container images, ensuring consistent runtime environments, easy scaling, and seamless migrations across different hosting providers or cloud regions.
  • Advanced Monitoring: Implement comprehensive monitoring solutions like Prometheus and Grafana for JVM-specific metrics (heap usage, garbage collection times, thread counts). Proactive monitoring allows for early detection of performance degradation and informed scaling decisions.
  • Dedicated Server for Critical Workloads: For mission-critical Java applications that demand peak, predictable performance and strict resource isolation, a Dedicated Server remains the gold standard. This provides exclusive access to hardware, allowing for granular tuning of the OS and JVM.

For Developers

  • Master `update-java-alternatives`: Become proficient with Ubuntu’s `update-java-alternatives` command. It’s an invaluable tool for switching between different JDK/JRE versions on your local machine and development servers without conflicts.
  • Understand `JAVA_HOME` and `PATH`: A deep understanding of how these environment variables influence Java execution is crucial for debugging and correctly configuring build tools and IDEs.
  • Utilize `jlink` for Custom Runtimes (Java 9+): For Java applications built with Java 9 and later, explore `jlink`. This tool allows you to create custom, minimal JRE runtimes containing only the modules your application needs. This significantly reduces the application’s footprint, making deployments smaller and more efficient, especially in containerized environments.

Related Hosting Solutions

The choice of hosting directly impacts the performance, security, and scalability of your Java applications. While a self-managed Ubuntu server provides flexibility, various hosting solutions cater to different operational needs and budgets.

premium hosting: This tier of service offers enhanced resources, often with optimized hardware, superior network connectivity, and priority support. For Java applications that are mission-critical, handle high traffic volumes, or require extremely low latency, Premium Hosting ensures peak performance and maximum uptime, justifying the higher investment through unparalleled reliability and speed.

Offshore Hosting: Businesses prioritizing specific data privacy regulations, seeking geographical diversification, or operating in niches where certain content restrictions are a concern often opt for Offshore Hosting. This solution provides servers located in jurisdictions that may offer different legal frameworks regarding data sovereignty and privacy, which can be a strategic advantage for specific business models.

Netherlands VPS: A popular choice for European and international businesses, a Netherlands VPS offers a compelling blend of cost-effectiveness, strong infrastructure, and adherence to EU data protection laws (like GDPR). For Java applications serving a European user base, it provides excellent network performance and a balance of independent server control with competitive pricing.

Dedicated Server: For the most demanding Java applications, a Dedicated Server provides exclusive access to physical hardware. This eliminates the “noisy neighbor” problem found in shared or virtualized environments, ensuring maximum performance, security, and customization. It’s ideal for high-transaction platforms, complex data processing, or large-scale enterprise systems where resource isolation and predictable performance are non-negotiable requirements.

Frequently Asked Questions About Java JRE on Ubuntu Servers

Why should I choose OpenJDK over Oracle JRE for my Ubuntu server?

OpenJDK is generally preferred for server deployments due to its open-source license, allowing for free commercial use and broad community support. It avoids the complexities and potential costs associated with Oracle’s commercial licensing for production environments, making it a more flexible and budget-friendly choice while offering comparable performance and regular security updates via Ubuntu’s package manager.

What is the `jre-headless` package, and why is it recommended for servers?

The `jre-headless` package is a minimal Java Runtime Environment that specifically excludes graphical user interface (GUI) components. For servers, where applications run in the background without a display, this version is highly recommended because it consumes significantly fewer resources (RAM and disk space) and presents a smaller attack surface compared to a full JRE or JDK, which includes unnecessary development tools and GUI libraries.

How do I switch between different JRE versions on my Ubuntu server?

Ubuntu’s `update-alternatives` system is designed to manage multiple versions of commands or applications, including Java. You can use `sudo update-alternatives –config java` to view installed Java versions and interactively select the one you want to set as the system default. For specific applications requiring a different JRE, you can override the system default by setting the `JAVA_HOME` environment variable within their respective startup scripts.

Can I run multiple Java applications requiring different JRE versions on the same Ubuntu server?

Yes, this is entirely feasible and a common scenario. You can install multiple JRE versions (e.g., OpenJDK 11 and OpenJDK 17) on your server. To ensure each application uses its correct JRE, explicitly configure the `JAVA_HOME` environment variable within each application’s `systemd` service file or startup script to point to the specific JRE installation it requires, bypassing the system-wide default.

What are the key security practices for running Java applications on an Ubuntu server?

Key security practices include maintaining regular updates for both your JRE and Ubuntu operating system packages to patch known vulnerabilities. Always run your Java applications under a dedicated, low-privilege system user to adhere to the principle of least privilege. Implement a robust firewall (like UFW) to restrict access to application ports. Additionally, conduct regular security audits of your application’s dependencies and consider using a reverse proxy for public-facing services.

Successfully installing and managing the Java JRE on your Ubuntu hosting solution is foundational for the stability, performance, and security of your Java-based applications. The decision between OpenJDK and Oracle JRE, the choice of Java version, and the attention to detail in configuration and maintenance are not merely technical tasks; they are strategic decisions that directly impact your operational efficiency and overall business success. By understanding the trade-offs and implementing best practices, you empower your applications to run optimally.

As you plan your deployments, remember that the right hosting environment complements a well-configured JRE. Evaluate your application’s resource demands, traffic patterns, and security needs to select a provider that aligns with your goals, whether that’s a flexible VPS, a privacy-focused offshore hosting solution, or the robust power of a dedicated server. Proactive management and continuous monitoring are the keys to long-term success. Begin with a solid JRE setup, monitor your application’s behavior, and iterate on your configurations to ensure your Java applications deliver consistent, high-quality performance.

Ready to get started?

Ready to Launch Your Website or Server Infrastructure?

Choose from Cheap Offshore Hosting, Premium Hosting, Netherlands VPS, and Dedicated Servers backed by reliable European infrastructure, LiteSpeed technology, and anonymous cryptocurrency checkout.

Semayra is a global hosting and infrastructure provider offering Offshore Hosting, Premium Hosting, Netherlands VPS, Dedicated Servers and Domain Registration services.

📍 New Delhi, India


Copyright 2026 . All Rights Reserved.

Contact Us
We Accept
PayPal Payment Gateway Bitcoin Payments
Indian Bank Transfer Payments

Semayra is a web hosting and digital infrastructure brand operated by Glare Web Tech LLP, New Delhi, India.