对finalize的理解

它是Object中的一个方法,子类重写它,垃圾回收时此方法会被调用,可以在其中进行一些资源释放和清理工作,但将资源释放和清理放在finalize方法中非常不友好,非常影响性能,严重时甚至会引起OOM,从java9开始就被标注为@Deprecated,不建议被使用。

为什么finalize方法非常不好,非常影响性能?

1. 非常不好

  1. FinalizerThread是守护线程,代码很有可能没来得及执行完,线程就结束了,造成资源没有正确释放。
  2. 异常会被吞掉,不能判断有没有在释放资源时发生错误。

2. 影响性能

  1. 重写了finalize方法的对象在第一次被GC时,并不能及时释放它占用的内存,因为要等着FinalizerThread调用完finalize,把它从第一个unfinalized队列移除后,第二次GC时才能真正释放内存。
  2. GC本就因为内存不足引起,finalize调用又很慢(两个队列的移除操作,都是串行执行的,用来释放连接类的资源应该也不快),不能及时释放内存,对象释放不及时就会逐渐移入老年代,老年代垃圾积累过多就会容易Full GC,Full GC释放速度如果仍跟不上创建新对象的速度,就会OOM。

3. 问题 

有的文章提到【Finalizer线程会和我们的主线程进行竞争,不过由于它的优先级较低,获取到的CPU时间较少,因此它永远也赶不上主线程的步伐】,这个显然是错误的,FinalizerThread的优先级较普通线程高,赶不上步伐的原因应该是finalize执行慢等原因导致的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是一个Windows窗体应用程序中的登录按钮事件处理程序。对于这段代码的优化,以下是一些建议: 1. 在处理用户输入之前,应该进行输入验证。例如,确保用户名和密码不为空,或者确保它们符合一定的格式要求。 2. SQL查询应该使用参数化查询,而不是直接将用户输入嵌入到SQL字符串中。这样可以避免SQL注入攻击。 3. 当处理异常时,应该提供更具体的错误消息,以帮助用户更好地理解问题所在。 4. 在登录成功后,应该清除密码框中的文本,并释放当前窗体的资源。 以下是优化后的代码示例: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim User As String Dim Password As String Dim sqlstr As String User = Me.TextBox1.Text.Trim Password = Me.TextBox2.Text.Trim ' 输入验证 If String.IsNullOrEmpty(User) OrElse String.IsNullOrEmpty(Password) Then MsgBox("用户名和密码不能为空。", MsgBoxStyle.Exclamation + MsgBoxStyle.OkOnly, "系统登录失败") Exit Sub End If ' 使用参数化查询 sqlstr = "SELECT users.UserName, users.RealName, users.RoleName from users WHERE UserName=@UserName AND Password=@Password" Dim parameters As New List(Of SqlParameter)() parameters.Add(New SqlParameter("@UserName", User)) parameters.Add(New SqlParameter("@Password", Password)) Dim objDataRow As DataRow Try objDataRow = GetDataFromDB(sqlstr, parameters.ToArray()).Tables.Item(0).Rows(0) Catch ex As Exception MsgBox("密码和账号不符,请重试,并检查该账号是否存在。", MsgBoxStyle.Exclamation + MsgBoxStyle.OkOnly, "系统登录失败") Me.TextBox2.Text = "" Exit Sub End Try ' 登录成功,获取用户信息 UserName = objDataRow.Item("UserName") RealName = objDataRow.Item("RealName") RoleName = objDataRow.Item("RoleName") ' 跳转到主窗体界面 Dim frmmain As New MainForm() frmmain.Show() ' 清除密码框中的文本 Me.TextBox2.Text = "" ' 释放资源 Me.Dispose() End Sub

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值