The Unable to save view config in 60 seconds error means the Designer missed a deadline. It does not mean the view is corrupt. On save, the Designer waits up to 60 s for the embedded Perspective session to return the finalized view configuration. When the Designer JVM runs out of heap (java.lang.OutOfMemoryError: Java heap space), that response is dropped and the wait always runs the full 60 s. Raise the Designer memory allocation from the Gateway settings and relaunch the Designer. On the affected install, going from 1 GB to 4 GB cleared the fault. If no OutOfMemoryError comes before the timeout, the problem is timing, usually a save issued while a view is still reloading after a bulk edit.
Log Signatures and the Quantity Behind Each
Four log entries appear together in the Designer Output Console. Each one records a different quantity passing a limit, so read them in time order before you change anything.
| Log entry | Thread | Quantity past its limit | What it tells you |
|---|---|---|---|
ERROR Calling RPC response observer... [FAIL] ... java.lang.OutOfMemoryError: Java heap space |
IPC Memory Reader Thread |
Designer JVM heap at its configured maximum | The reply from the embedded Perspective session could not be allocated. The save is already lost here. |
INFO edt-watchdog -- Non-responsive UI thread detected. Stack saved at ...NonResponsiveEdt-<date>_<time>.json |
EDT-Watchdog-1 |
GUI thread blocked beyond the watchdog threshold | The save is running synchronously on the GUI thread, so the whole Designer looks frozen. |
ERROR ViewResourceEditor -- Timeout saving view / java.util.concurrent.TimeoutException at ViewResourceEditor.getObjectForSave(ViewResourceEditor.java:469)
|
AWT-EventQueue-0 |
60 s save deadline | The CompletableFuture holding the view config was never completed. |
ErrorUtil -- Unable to save view config in 60 seconds. Consider specifying a longer timeout via the 'ignition.perspective.designerSaveTimeout' Designer property. |
AWT-EventQueue-0 |
Same deadline, shown to the user | This is the dialog text. It suggests a remedy that only fits one of the two root causes. |
INFO designer.update-and-save -- Save finished in 337ms |
AWT-EventQueue-0 |
None | After the timed-out view is abandoned, the rest of the save completes normally. |
The timestamps in the captured log give the sequence:
-
22:54:46.191:
Save finished in 337ms.
The number that matters is the gap between the OutOfMemoryError and the timeout. If the OOM comes first and the timeout lands about 60 s later, the minute of freeze was spent waiting on a dead request. This is memory, not logic.
Gateway Memory Versus Designer Heap
The Gateway status page and the Designer report on two separate JVMs. On the affected system, Gateway CPU swung between 30% and 70% and Gateway memory between 700 MB and 1450 MB. Those figures describe the Gateway service's heap. A Gateway heap that climbs and then drops is normal garbage-collection behavior. It says nothing about the Designer, which is a separate Java process on the engineering workstation with its own maximum heap.
The OOM in the log came from the Designer's IPC Memory Reader Thread, which lives in the Designer process. A Gateway with plenty of free memory can still serve a Designer that is starved at 1 GB. Diagnose Designer heap from the Designer's own log and its own process. Gateway status graphs cannot settle it.
The Ignition free trial does not cap memory either. Its only limit is the two-hour runtime; otherwise the trial is fully functional. A trial Gateway and a licensed Gateway fail this save the same way when the Designer heap is undersized.
Save Path Through the Embedded Perspective Session
Saving a Perspective view involves more work than writing a file, which is why this path is sensitive to both heap and timing. The Designer is a Java desktop application. Views are edited inside an embedded web browser engine that runs a live Perspective session. On save, the call stack shows this sequence:
-
IgnitionDesigner.handleSavecallscommitAll. This notifies the Perspective module hook (DesignerHook.notifyProjectSaveStart) and the view workspace (ViewWorkspace.notifyProjectSaveStart). -
TabbedResourceWorkspace.commitAllgoes through every open view editor and callsResourceEditor.commiton each. - For each view,
ViewResourceEditor.getObjectForSavecalls into the embedded browser session. The session finalizes its internal state, renders a preview thumbnail, and serializes the view config back across the inter-process link. - The Designer blocks on a
CompletableFuture.getwith a timeout until that reply arrives or the deadline expires. - Once every editor has committed, the Designer writes the resources to the Gateway, which is the
Save finished in N msline.
In 8.1 this exchange is synchronous and runs on the main GUI thread. While step 4 waits, the Designer cannot repaint, respond to clicks, or accept keyboard input. That explains why a heap failure a fraction of a second into the save produces a full minute of apparent lockup.
The same commit also runs when you close a view tab. A second captured trace shows TabbedResourceWorkspace.close leading to ResourceEditor.commit and the same getObjectForSave timeout. Closing a dirty view is therefore a save event and can freeze the Designer in the same way.
Why the Heap Runs Out at Save Time
Steady-state Designer memory can look fine and still fail during a save, because the save adds a large, short-lived allocation on top of everything already loaded. The failed RPC response in the log is tagged serialized_message: "[...18450018]". If that figure is the payload length in bytes, the reply carrying the view config back from the session was about 18 MB. The JVM does not receive a payload of that size in one copy. It is buffered, decoded into strings, and parsed into an object tree, and each stage holds its own copy until the next stage finishes. Peak transient demand is therefore several times the raw payload size.
Add that peak to what is already on the heap: the project resource tree, every open view editor, tag browser caches, and component palettes. A 1 GB ceiling leaves little room. Whether the save succeeds depends on peak heap during the save, not the average between saves.
Several conditions push the peak higher:
- Many views open at once.
commitAllround-trips every open, modified editor during a single save. - Large views with deep component trees or large embedded data in props, which produce large serialized replies.
- Long Designer sessions in which open resources and caches have built up.
The 60-Second Deadline and ignition.perspective.designerSaveTimeout
The 60 s limit protects the Designer. Because the save blocks the GUI thread, a Perspective session that never replies would otherwise hang the Designer indefinitely. The timeout message replaced the older View Config is Undefined message and arrived together with changes to the Java-to-browser interop layer meant to prevent these stalls.
The dialog text suggests raising the deadline through the ignition.perspective.designerSaveTimeout Designer property. Whether that helps depends on which root cause you have:
| Condition in the log | Is the reply still coming? | Effect of a longer timeout |
|---|---|---|
OutOfMemoryError: Java heap space shortly after save starts |
No. The response observer failed and the reply was discarded. | The freeze lasts longer and the save still fails. Fix the heap. |
| No OOM; save stalls only on very large views; the session is responsive afterward | Yes, just slowly. | Can let a slow but healthy session finish. |
| No OOM; freeze only when saving during a view reload | Stalled for the duration of the reload conflict | The freeze lasts longer. Avoid the timing window instead. |
The property is read by the Designer JVM, so it has to be passed to the Designer at launch as a Java system property (-Dignition.perspective.designerSaveTimeout=<value>), in whatever place your Designer Launcher accepts JVM arguments for that Gateway entry. Check the unit of <value> and the supported way to set it for your version in Inductive Automation's documentation or with their support team before relying on it. A wrong unit can turn a 60 s deadline into a few milliseconds or several hours.
Procedure: Raising the Designer Memory Allocation
-
Confirm the OOM. Open the Designer Output Console and look for
java.lang.OutOfMemoryError: Java heap spaceon theIPC Memory Reader Threadin the second before the timeout. If it is missing, skip to the reload-window section. - Budget host RAM. The new maximum heap must fit in physical memory, alongside the embedded browser engine process, the operating system, and the Gateway if it runs on the same machine. On the affected system the Gateway alone ranged from 700 MB to 1450 MB. A heap that forces the OS to page makes every save slower and moves the failure from OOM to timeout.
- Open the Gateway web interface and go to the Gateway Settings page. The Designer memory allocation is set there, because the Gateway supplies the launch parameters to Designers that connect to it.
- Step the value up. On the affected project, 1 GB failed and 4 GB saved cleanly. Move one step at a time instead of jumping to the host's limit. Excess heap lengthens full garbage-collection pauses and takes memory from the browser engine.
- Save the Gateway setting, then close every open Designer connected to that Gateway. JVM maximum heap is fixed when the process starts, so a running Designer keeps its old ceiling.
- Relaunch the Designer from the launcher, open the same set of views that were open during the failure, and repeat the save that timed out.
Reload-Window Race After Find/Replace and Bulk Edits
A second failure mode produces the same 60 s timeout without any memory shortage. It was seen on a workstation with 32 GB of RAM and a Designer heap of 4096 MB. The Designer froze for about a minute, showed the timeout, and then saved normally on the next attempt. This fault is timing: the save request arrives while the Perspective session is rebuilding the view.
It can be reproduced in a new project:
- Create a new Perspective view.
- Add a Label component and set
props.texttofoo. - Right-click the view and choose Find/Replace selected Views.
- Search for
foo, click Find, and check that the label'sprops.textappears in the results. - Set the replacement to
bar, click Replace All, and confirm. - The view briefly disappears and reloads. Press Ctrl+S while it is reloading, closing the Find/Replace window first if needed.
A save issued before the view disappears succeeds, and so does a save issued after it reappears. Only a save that lands inside the reload window freezes the Designer. The likely mechanism is contention between the Designer's save request and the Gateway/session-side reload, with both sides waiting on each other until the 60 s deadline breaks the stall. On large projects the reload after bulk edits takes much longer, even on well-equipped machines, so the window is wide enough to hit by habit.
Workaround: after any Find/Replace, bulk property edit, or other operation that forces a view reload, wait until the view has fully redrawn before saving or closing the tab. More heap does not shorten this window.
Verification
-
Save duration: after the fix, each save should log
INFO designer.update-and-save -- Save finished in N mswith no precedingTimeout saving view. For scale, the save that followed the timeout on the affected system took 337 ms. -
No heap failure: the Output Console should show no
OutOfMemoryErroracross several saves with your normal working set of views open. -
No watchdog dumps: no new
NonResponsiveEdt-<date>_<time>.jsonfiles should appear in%USERPROFILE%\.ignition\cache\gw<gateway-address>_<port>\C0\. A new file means the GUI thread blocked again, even if the save eventually worked. - Peak heap headroom: attach a standard JDK monitoring tool such as JConsole or VisualVM to the Designer process, or use the Designer's diagnostics window. Watch used heap during a save of your largest view. If the peak stays well below the configured maximum, you have margin. If it touches the ceiling, the next larger view will fail again.
- Close-tab path: modify a large view and close its tab without saving first. The implicit commit should finish without a freeze.
- Bulk-edit path: run a Find/Replace, wait for the reload to finish, then save. The save should succeed on the first attempt.
Recurring Pitfalls
| Pitfall | Effect | Correction |
|---|---|---|
| Reading Gateway status memory as Designer memory | The Designer heap is never examined; the wrong JVM gets tuned | Diagnose from the Designer Output Console and the Designer process |
| Blaming free-trial limits | Time lost on licensing | The trial's only limit is the two-hour runtime |
Raising ignition.perspective.designerSaveTimeout to cover an OOM |
Longer freezes, the same failed save | Raise Designer heap; use the timeout only for slow but healthy sessions |
| Changing Designer memory without relaunching | The old heap ceiling stays in effect | Close all Designers and relaunch from the launcher |
| Saving or closing tabs during a view reload | Designer freeze even with ample heap | Wait until the view has fully redrawn after bulk edits |
| Keeping dozens of views open |
commitAll round-trips every open editor; heap peak and save time both grow |
Close views you are not editing before saving |
| Oversizing heap on a shared host | Paging and long GC pauses slow every save | Size heap within physical RAM left over after the Gateway and browser engine |
When to Stop and Escalate
Escalate once the Designer heap has confirmed headroom during saves, no OutOfMemoryError appears, and the freeze still happens outside any reload window. At that point, local tuning has nothing left to adjust. Open a formal case with Inductive Automation support. Attach the NonResponsiveEdt JSON stack dumps, the Designer log covering the full 60 s window, the Designer memory setting, and a minimal reproduction. That data is what their team uses to track and fix save-path defects.
FAQ
Does the Ignition free trial limit Designer memory or cause save timeouts?
No. The only limit on the free trial is the two-hour runtime; everything else is fully functional. A save timeout on a trial Gateway comes from the same causes as on a licensed one, usually Designer heap exhaustion or saving during a view reload.
Can I fix Unable to save view config in 60 seconds by increasing ignition.perspective.designerSaveTimeout?
Only if the Perspective session is slow but still responding. If an OutOfMemoryError: Java heap space appears just after the save starts, the reply has already been discarded, and a longer timeout only lengthens the freeze. Raise the Designer memory allocation in Gateway Settings instead; moving from 1 GB to 4 GB resolved it on an affected project.
Does closing a Perspective view tab trigger the same save timeout?
Yes. Closing a modified view runs TabbedResourceWorkspace.close, which calls ResourceEditor.commit and the same getObjectForSave round trip, so the freeze and timeout can occur without pressing Save. Wait for any in-progress view reload to finish before closing tabs.