Наше Java-приложение на основе AWT часто выдает ошибку StackOverflowError в JDK Ubuntu Linux с 11 по 23 (но потоко-стохастически). См. три примера трассировки стека ниже. Предложения или сочувствие? Мы частично смягчили эту проблему, вынеся функцию validate() компонентов в отдельный поток, чтобы AWT EventQueue не зависал. Мы подозреваем ошибку в самой Java. (Наше приложение было создано в 1997 году, имеет >>200 тыс. строк и не будет преобразовано в Swing. Прекрасно работает с JDK 8–23 для macOS, Windows и JDK 8 в Linux.)
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at java.desktop/javax.swing.text.View.getContainer(View.java:1014)
at java.desktop/javax.swing.text.WrappedPlainView.updateMetrics(WrappedPlainView.java:442)
at java.desktop/javax.swing.text.WrappedPlainView.getPreferredSpan(WrappedPlainView.java:540)
at java.desktop/javax.swing.plaf.basic.BasicTextUI$RootView.getPreferredSpan(BasicTextUI.java:1454)
at java.desktop/javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:950)
at java.desktop/javax.swing.plaf.basic.BasicTextAreaUI.getPreferredSize(BasicTextAreaUI.java:121)
at java.desktop/javax.swing.JComponent.getPreferredSize(JComponent.java:1734)
at java.desktop/javax.swing.JTextArea.getPreferredSize(JTextArea.java:623)
at java.desktop/javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:799)
at java.desktop/java.awt.Container.layout(Container.java:1541)
at java.desktop/java.awt.Container.doLayout(Container.java:1530)
at java.desktop/java.awt.Container.validateTree(Container.java:1725)
at java.desktop/java.awt.Container.validate(Container.java:1660)
at java.desktop/sun.awt.X11.XTextAreaPeer.setFont(XTextAreaPeer.java:392)
at java.desktop/java.awt.Component.validate(Component.java:2988)
at java.desktop/java.awt.Container.validateTree(Container.java:1743)
at java.desktop/java.awt.Container.validate(Container.java:1660)
at java.desktop/sun.awt.X11.XTextAreaPeer.setFont(XTextAreaPeer.java:392)
at java.desktop/java.awt.Component.validate(Component.java:2988)
at java.desktop/java.awt.Container.validateTree(Container.java:1743)
at java.desktop/java.awt.Container.validate(Container.java:1660)
at java.desktop/sun.awt.X11.XTextAreaPeer.setFont(XTextAreaPeer.java:392)
at java.desktop/java.awt.Component.validate(Component.java:2988)
at java.desktop/java.awt.Container.validateTree(Container.java:1743)
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at java.base/java.util.HashMap.hash(HashMap.java:338)
at java.base/java.util.HashMap.getNode(HashMap.java:576)
at java.base/java.util.HashMap.get(HashMap.java:564)
at java.desktop/sun.swing.SwingUtilities2.getFRCFromCache(SwingUtilities2.java:1281)
at java.desktop/sun.swing.SwingUtilities2.getFRCProperty(SwingUtilities2.java:1255)
at java.desktop/sun.swing.SwingUtilities2.getFontMetrics(SwingUtilities2.java:1238)
at java.desktop/javax.swing.JComponent.getFontMetrics(JComponent.java:1700)
at java.desktop/javax.swing.text.WrappedPlainView.updateMetrics(WrappedPlainView.java:444)
at java.desktop/javax.swing.text.WrappedPlainView.getPreferredSpan(WrappedPlainView.java:540)
at java.desktop/javax.swing.plaf.basic.BasicTextUI$RootView.getPreferredSpan(BasicTextUI.java:1454)
at java.desktop/javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:950)
at java.desktop/javax.swing.plaf.basic.BasicTextAreaUI.getPreferredSize(BasicTextAreaUI.java:121)
at java.desktop/javax.swing.JComponent.getPreferredSize(JComponent.java:1734)
at java.desktop/javax.swing.JTextArea.getPreferredSize(JTextArea.java:623)
at java.desktop/javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:799)
at java.desktop/java.awt.Container.layout(Container.java:1541)
at java.desktop/java.awt.Container.doLayout(Container.java:1530)
at java.desktop/java.awt.Container.validateTree(Container.java:1725)
at java.desktop/java.awt.Container.validate(Container.java:1660)
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at java.desktop/javax.swing.border.AbstractBorder.getBorderInsets(AbstractBorder.java:80)
at java.desktop/javax.swing.JComponent.getInsets(JComponent.java:1894)
at java.desktop/javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:935)
at java.desktop/javax.swing.plaf.basic.BasicTextAreaUI.getPreferredSize(BasicTextAreaUI.java:121)
at java.desktop/javax.swing.JComponent.getPreferredSize(JComponent.java:1734)
at java.desktop/javax.swing.JTextArea.getPreferredSize(JTextArea.java:623)
at java.desktop/javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:799)
at java.desktop/java.awt.Container.layout(Container.java:1541)
at java.desktop/java.awt.Container.doLayout(Container.java:1530)
at java.desktop/java.awt.Container.validateTree(Container.java:1725)
at java.desktop/java.awt.Container.validate(Container.java:1660)
Наше Java-приложение на основе AWT часто выдает ошибку StackOverflowError в JDK Ubuntu Linux с 11 по 23 (но потоко-стохастически). См. три примера трассировки стека ниже. Предложения или сочувствие? Мы частично смягчили эту проблему, вынеся функцию validate() компонентов в отдельный поток, чтобы AWT EventQueue не зависал. Мы подозреваем ошибку в самой Java. (Наше приложение было создано в 1997 году, имеет >>200 тыс. строк и не будет преобразовано в Swing. Прекрасно работает с JDK 8–23 для macOS, Windows и JDK 8 в Linux.) [code]Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError at java.desktop/javax.swing.text.View.getContainer(View.java:1014) at java.desktop/javax.swing.text.WrappedPlainView.updateMetrics(WrappedPlainView.java:442) at java.desktop/javax.swing.text.WrappedPlainView.getPreferredSpan(WrappedPlainView.java:540) at java.desktop/javax.swing.plaf.basic.BasicTextUI$RootView.getPreferredSpan(BasicTextUI.java:1454) at java.desktop/javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:950) at java.desktop/javax.swing.plaf.basic.BasicTextAreaUI.getPreferredSize(BasicTextAreaUI.java:121) at java.desktop/javax.swing.JComponent.getPreferredSize(JComponent.java:1734) at java.desktop/javax.swing.JTextArea.getPreferredSize(JTextArea.java:623) at java.desktop/javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:799) at java.desktop/java.awt.Container.layout(Container.java:1541) at java.desktop/java.awt.Container.doLayout(Container.java:1530) at java.desktop/java.awt.Container.validateTree(Container.java:1725) at java.desktop/java.awt.Container.validate(Container.java:1660) at java.desktop/sun.awt.X11.XTextAreaPeer.setFont(XTextAreaPeer.java:392) at java.desktop/java.awt.Component.validate(Component.java:2988) at java.desktop/java.awt.Container.validateTree(Container.java:1743) at java.desktop/java.awt.Container.validate(Container.java:1660) at java.desktop/sun.awt.X11.XTextAreaPeer.setFont(XTextAreaPeer.java:392) at java.desktop/java.awt.Component.validate(Component.java:2988) at java.desktop/java.awt.Container.validateTree(Container.java:1743) at java.desktop/java.awt.Container.validate(Container.java:1660) at java.desktop/sun.awt.X11.XTextAreaPeer.setFont(XTextAreaPeer.java:392) at java.desktop/java.awt.Component.validate(Component.java:2988) at java.desktop/java.awt.Container.validateTree(Container.java:1743) [/code] и т. д.... [code]Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError at java.base/java.util.HashMap.hash(HashMap.java:338) at java.base/java.util.HashMap.getNode(HashMap.java:576) at java.base/java.util.HashMap.get(HashMap.java:564) at java.desktop/sun.swing.SwingUtilities2.getFRCFromCache(SwingUtilities2.java:1281) at java.desktop/sun.swing.SwingUtilities2.getFRCProperty(SwingUtilities2.java:1255) at java.desktop/sun.swing.SwingUtilities2.getFontMetrics(SwingUtilities2.java:1238) at java.desktop/javax.swing.JComponent.getFontMetrics(JComponent.java:1700) at java.desktop/javax.swing.text.WrappedPlainView.updateMetrics(WrappedPlainView.java:444) at java.desktop/javax.swing.text.WrappedPlainView.getPreferredSpan(WrappedPlainView.java:540) at java.desktop/javax.swing.plaf.basic.BasicTextUI$RootView.getPreferredSpan(BasicTextUI.java:1454) at java.desktop/javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:950) at java.desktop/javax.swing.plaf.basic.BasicTextAreaUI.getPreferredSize(BasicTextAreaUI.java:121) at java.desktop/javax.swing.JComponent.getPreferredSize(JComponent.java:1734) at java.desktop/javax.swing.JTextArea.getPreferredSize(JTextArea.java:623) at java.desktop/javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:799) at java.desktop/java.awt.Container.layout(Container.java:1541) at java.desktop/java.awt.Container.doLayout(Container.java:1530) at java.desktop/java.awt.Container.validateTree(Container.java:1725) at java.desktop/java.awt.Container.validate(Container.java:1660) [/code] а затем бесконечный цикл, как указано выше.... [code]Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError at java.desktop/javax.swing.border.AbstractBorder.getBorderInsets(AbstractBorder.java:80) at java.desktop/javax.swing.JComponent.getInsets(JComponent.java:1894) at java.desktop/javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:935) at java.desktop/javax.swing.plaf.basic.BasicTextAreaUI.getPreferredSize(BasicTextAreaUI.java:121) at java.desktop/javax.swing.JComponent.getPreferredSize(JComponent.java:1734) at java.desktop/javax.swing.JTextArea.getPreferredSize(JTextArea.java:623) at java.desktop/javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:799) at java.desktop/java.awt.Container.layout(Container.java:1541) at java.desktop/java.awt.Container.doLayout(Container.java:1530) at java.desktop/java.awt.Container.validateTree(Container.java:1725) at java.desktop/java.awt.Container.validate(Container.java:1660) [/code] а затем бесконечный цикл, как указано выше....