pyqt tableview大数据自动退出_JAVAFX之tableview界面实时刷新导致的内存溢出(自己挖的坑,爬着也要出来啊0.0)...

9d71505ba151bf0286da2c0c47389b71.gif

2ed7a5a12fe9860fd6d125daf62e16d4.png

Linux编程 点击右侧关注,免费入门到精通! b67220f96e7d2b9e209c8c252aed9f2b.png

9200ea1a52476559bc1e8d30fb6baadb.png

黑客技术 点击右侧关注,了解黑客的世界! b67220f96e7d2b9e209c8c252aed9f2b.png

作者丨队长给我球。

https://www.cnblogs.com/JJJ1990/p/9111199.html

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

【无门槛免费领】

535G超强程序员编程

0基础从入门到精通自学视频教程!

9d8e02b72e0bb7b37801d4217d5c32d7.png

bd9e62f18b9433118aee16f78ac8d3ad.png 8885a76731a252a4bd4fc37107bfbd51.png

bc29152cfa7310e41c32e84cf5c51d96.png 3872ded1e403d33aef56a97625d3836e.png e1d1e58aece2397dd89a8000f4cce765.png

dbad0708567dee0abc29a16f3e89d1d2.png 0874a169013a34d4444c4c8bc72b5add.png 74218e59c56133de24151fccda409a64.png

e1d1e58aece2397dd89a8000f4cce765.png 7a1e3dadb34e9d2c9bd6f7814eec3d4c.png dbad0708567dee0abc29a16f3e89d1d2.png

d24cc1accf37c118408b4bb56f691dd0.png f0455aa05bd1efe30cfa4b23aa577ab9.png 4e20c1c8f8c5eddb2be01e32cb62d914.png cfc6510479ace6b67bc36a4528e6e991.png

5a7bdcc1bd0dc31007a70f1fef7cfe1a.png万水千山总是情,点个 “ 在看” 行不行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值