# Java Heap Configuration for Redundant Ignition Gateways

**URL:** <https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168>\
**Category:** Ignition\
**Created:** [August 26, 2025, 7:08am UTC](https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168 "2025-08-26T07:08:52Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![Antonio\_Ortega](https://avatars.discourse-cdn.com/v4/letter/a/c37758/32.png) [@Antonio\_Ortega](https://forum.inductiveautomation.com/u/Antonio_Ortega)\
**Post date:** [August 26, 2025, 7:08am UTC](https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168/1 "2025-08-26T07:08:52Z")

</div>

Good morning,

I’m working on a project that involves two redundant Ignition gateways. Both servers have 64 GB of RAM, and neither hosts a local database, the database resides on a separate machine within the network.

The project includes approximately 40.000 tags and uses Sepasoft MES modules, which adds significant processing requirements.

I would appreciate your advice on configuring the Java heap. Currently, the settings in `ignition.conf` are as follows:

# Initial Java Heap Size (in MB)

wrapper.java.initmemory=8192

# Maximum Java Heap Size (in MB)

wrapper.java.maxmemory=31744

I’ve read that allocating more than 32 GB can disable pointer compression (Compressed OOPs), which may lead to higher memory consumption and reduced performance.

Could you confirm if this configuration is optimal, or suggest best practices for this scenario?

Thank you for your guidance.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [August 26, 2025, 12:15pm UTC](https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168/2 "2025-08-26T12:15:53Z")

</div>

1. Always set initial heap equal to max heap. Let java grab it all up front.

2. Monitor your actual runtime memory usage. It should make a sawtooth on the gateway's time series chart. I recommend tweaking to achieve a sawtooth that swings from ~40% usage to ~85% usage.

3. Ensure there is a setting for the GC stall target. I recommend 250ms or less.

---

<div class="post-metadata">

**Author:** ![Antonio\_Ortega](https://avatars.discourse-cdn.com/v4/letter/a/c37758/32.png) [@Antonio\_Ortega](https://forum.inductiveautomation.com/u/Antonio_Ortega)\
**Post date:** [August 27, 2025, 2:10pm UTC](https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168/3 "2025-08-27T14:10:03Z")

</div>

Hi Phil,

Since the redundant servers have 64 GB of RAM, would it be possible to allocate more than 32 GB to the `initmemory` and `maxmemory` parameters without any issues?

Thanks so much for your help!

Best regards,  
Antonio

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [August 27, 2025, 2:32pm UTC](https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168/4 "2025-08-27T14:32:54Z")

</div>

I do not know anything about the pointer compression issue, sorry. I would think if you need the heap, having it will outweigh other considerations.

I **do** know that giving Ignition a lot more memory than it normally needs can create occasional stalls when the heap finally creeps up towards the max. It can also trick hypervisors into swapping out what appears to be inactive memory, with huge latency spikes when java gets to it.

You should aim for the bottom of the sawtooth to be ~ 40% of your heap.

---

<div class="post-metadata">

**Author:** ![Antonio\_Ortega](https://avatars.discourse-cdn.com/v4/letter/a/c37758/32.png) [@Antonio\_Ortega](https://forum.inductiveautomation.com/u/Antonio_Ortega)\
**Post date:** [August 28, 2025, 6:30am UTC](https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168/5 "2025-08-28T06:30:56Z")

</div>

Thanks so much Phil, I will apply your knowledge.

Best regards,  
Antonio

---

<div class="post-metadata">

**Author:** ![andrew.budaiev](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/andrew.budaiev/32/72921_2.png) [@andrew.budaiev](https://forum.inductiveautomation.com/u/andrew.budaiev)\
**Post date:** [August 28, 2025, 7:22am UTC](https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168/6 "2025-08-28T07:22:01Z")

</div>

> [@pturmel](#):
>
> 1. Ensure there is a setting for the GC stall target. I recommend 250ms or less.

Are you talking about this one? It’s the only thing I could find that sounds similar.

`wrapper.jave.additional.14=-XX:MaxGCPauseMillis=100`

P.S. Just noticed it’s jav **e**. I hope it works.🤓

---

<div class="post-metadata">

**Author:** ![bschroeder](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bschroeder/32/13260_2.png) [@bschroeder](https://forum.inductiveautomation.com/u/bschroeder)\
**Post date:** [August 28, 2025, 11:05am UTC](https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168/7 "2025-08-28T11:05:27Z")

</div>

It needs to be spelled correctly. But yes that is the config @pturmel is talking about.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [August 28, 2025, 12:50pm UTC](https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168/8 "2025-08-28T12:50:45Z")

</div>

Yes. 250ms is good enough for most users. People doing high speed data collection, like users of Class1 EtherNet/IP, usually need 100ms or even 50ms there.

---

<div class="post-metadata">

**Author:** ![andrew.budaiev](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/andrew.budaiev/32/72921_2.png) [@andrew.budaiev](https://forum.inductiveautomation.com/u/andrew.budaiev)\
**Post date:** [August 28, 2025, 1:12pm UTC](https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168/9 "2025-08-28T13:12:02Z")

</div>

> [@bschroeder](#):
>
> It needs to be spelled correctly.

I’ve copy-pasted it from the conf file like that 🤷‍♂️

---

<div class="post-metadata">

**Author:** ![bschroeder](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bschroeder/32/13260_2.png) [@bschroeder](https://forum.inductiveautomation.com/u/bschroeder)\
**Post date:** [August 28, 2025, 1:17pm UTC](https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168/10 "2025-08-28T13:17:59Z")

</div>

Don't know what to tell you. It needs to be `wrapper.java.additional.14=-XX:MaxGCPauseMillis=100`not `wrapper.jave.additional.14=-XX:MaxGCPauseMillis=100`. So it is ignoring that config and will continue to ignore it until you fix it.

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [August 28, 2025, 1:34pm UTC](https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168/11 "2025-08-28T13:34:40Z")

</div>

The default max pause time is 200ms, so you're actually relaxing it a bit by setting it to 250ms.

Most people don't need to change this.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [August 28, 2025, 2:00pm UTC](https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168/12 "2025-08-28T14:00:32Z")

</div>

> [@Kevin.Herron](#):
>
> default max pause time is 200ms,

Hmmm. I obviously haven't kept up with java changes. ☹

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [August 28, 2025, 2:02pm UTC](https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168/13 "2025-08-28T14:02:20Z")

</div>

It doesn't seem to be documented. I didn't find a source I trusted until I went to the actual source: [jdk17/src/hotspot/share/gc/g1/g1Arguments.cpp at 4afbcaf55383ec2f5da53282a1547bac3d099e9d · openjdk/jdk17 · GitHub](https://github.com/openjdk/jdk17/blob/4afbcaf55383ec2f5da53282a1547bac3d099e9d/src/hotspot/share/gc/g1/g1Arguments.cpp#L166-L169)

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [August 28, 2025, 2:04pm UTC](https://forum.inductiveautomation.com/t/java-heap-configuration-for-redundant-ignition-gateways/110168/14 "2025-08-28T14:04:06Z")

</div>

I thought it was 1000ms in java 11, which didn't play well with Ignition's drift detector.
