JAVAFX之tableview界面实时刷新导致的内存溢出(自己挖的坑,爬着也要出来啊0.0)
这几天遇到了一个问题,不幸开发的一个cs架构的工具,客户端开启后,内存一直在缓慢增长最终导致进程卡死,花了4天时间,终于爬出来了。。。
客户端通过timer定时器每30秒查询一次数据库以及一些业务逻辑操作,然后刷新界面的表格数据。
但是每次调用方法后,都会导致内存的增长,然后我将方法内部的变量在使用完之后手动设置为null 而且最后调用了gc 但是都没有什么效果,
最终还是会导致内存溢出,进程卡死。(估计是释放的速度,赶不上增长的速度。。。)
之后对定时部分的代码逐段进行了排查,最后发现是由于 我之前在对tableview进行实时刷新时导致的
代码如下:
1 if (tableKeywordCompetePrice.getItems().get(tableKeywordCompetePrice.getItems().size() - 1).getKeyword() == null) 2 3 { 4 tableKeywordCompetePrice.getItems().remove(tableKeywordCompetePrice.getItems().size() - 1); 5 } 6 else 7 { 8 tableKeywordCompetePrice.getItems().add(new KeywordCompetePriceInfo()); 9 tableKeywordCompetePrice.getItems().get(tableKeywordCompetePrice.getItems().size() - 1).getCheckBox().setVisible(false); 10 }
其中 tableKeywordCompetePrice 就是 一个 tableview 对象。
因为当 list 中元素属性变化时候, table 不能实时刷新。(因为此时修改事件并不受监听,list 不认为自己有变化,随之 table 也就不会刷新),所以我就采用了直接改变list大小来进行刷新。
tableview实时刷新有2种方式:
第一种是我上面采用的方式直接修改list的大小,简单粗暴。(但是没想到给自己挖了一个大坑。。。。0.0)
第二种就是 与 JavaFx UI 层进行交互的类属性,应当定义为对应的 xxxProperty 包装类 (如 StringProperty , IntegerProperty 等 )。
然后,在对 table cellValueFactory 定义时,就可以直接返回 xxxProperty 对象 (因为 StringProperty 本身就是 ObservableValue 的子类) ,这个麻烦的一点就是要挨个对需要监听的字段都增加这段代码。
例如:
1 private final StringProperty device = new SimpleStringProperty(); 2 3 public StringProperty deviceProperty() { 4 return device; 5 } 6 // 原有的 set 方法,并不受字段类型变化而改变,仍然返回同样的类型,只是方法体需要修改一下 7 public void setDevice(String status) { 8 this.device.set(status); 9 } 10 11 // 原有的 get 方法,并不受字段类型变化而改变,仍然返回同样的类型,只是方法体需要修改一下 12 public String getDevice(){ 13 return device.get(); 14 }
展示实体类修改成上述代码后,就可以自动监听到device列对象属性的变化,从而进行实时刷新。
修改成这样后,内存基本很稳定。。。想哭。。。
目前对于为什么修改list大小会导致内存一直增长还是没想~明~白。
希望还有人用javafx tableview组件的时候能看到我这篇文章,免得也掉进坑中~~~~0.0。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)