JAVAFX之tableview界面实时刷新导致的内存溢出(自己挖的坑,爬着也要出来啊0.0)

简介: 这几天遇到了一个问题,不幸开发的一个cs架构的工具,客户端开启后,内存一直在缓慢增长最终导致进程卡死,花了4天时间,终于爬出来了。。。客户端通过timer定时器每30秒查询一次数据库以及一些业务逻辑操作,然后刷新界面的表格数据。

这几天遇到了一个问题,不幸开发的一个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。

give me the ball!
相关文章
|
1月前
|
存储 JSON 监控
Higress Controller**不是将配置信息推送到Istio的内存存储里面的**。
【2月更文挑战第30天】Higress Controller**不是将配置信息推送到Istio的内存存储里面的**。
14 1
|
2月前
|
存储 编译器 C语言
C语言:数据在内存中的存储形式
C语言:数据在内存中的存储形式
|
1月前
|
存储 C语言
C语言--------数据在内存中的存储
C语言--------数据在内存中的存储
26 0
|
6天前
|
存储 NoSQL Oracle
Oracle 12c的内存列存储:数据的“闪电侠”
【4月更文挑战第19天】Oracle 12c的内存列存储以超高速度革新数据处理,结合列存储与内存技术,实现快速查询与压缩。它支持向量化查询和并行处理,提升效率,但需合理配置以平衡系统资源。作为数据管理员,应善用此功能,适应业务需求和技术发展。
|
16天前
|
存储 C语言
数据在内存中的存储2
数据在内存中的存储2
|
16天前
|
存储 编译器
数据在内存中的存储1
数据在内存中的存储
|
26天前
|
存储 编译器 程序员
【C语言】整形数据和浮点型数据在内存中的存储
【C语言】整形数据和浮点型数据在内存中的存储
16 0
|
1月前
|
存储 Windows 容器
浮点数在内存中的存储
浮点数在内存中的存储
18 2
|
1月前
|
存储 小程序 C语言
【深度剖析数据在内存中的存储】C语言
【深度剖析数据在内存中的存储】C语言
|
1月前
|
存储 小程序 C语言
【C语言进阶】深度剖析数据在内存中的存储
【C语言进阶】深度剖析数据在内存中的存储

热门文章

最新文章