代码之家  ›  专栏  ›  技术社区  ›  Basilevs

内存泄漏在哪里?

  •  2
  • Basilevs  · 技术社区  · 14 年前

    我使用inetaddress解析IP地址,但现在如果IP不可用,就需要存储主机名。所以我介绍了一个班级主持人。

    case class Host(name:String, ip:InetAddress) {
        import Host.{addressToBytes, compareSeqs}
        override def toString:String = if (ip!=null) {ip.getHostName} else {name}
    }
    
    object Host {
        implicit def stringToPattern(s:String): Pattern = Pattern.compile(s)
        val separators = Seq[Pattern]("\\.", ":")
        def separatedStrToBytes(s:String, separator:Pattern): Array[Byte] = {
            val fields = separator.split(s)
            var rv = new Array[Byte](fields.length);
            fields.map(_.toInt.toByte).copyToArray(rv, 0)
            rv
        }
        implicit def strToBytes(s:String): Array[Byte] = {
            for (sep <- separators)
                if (sep.matcher(s).find())
                    return separatedStrToBytes(s, sep)
            null
        }
        implicit def strToHost(s:String):Host = {
            var name = s
            var ip:InetAddress = null
            try {
                val bytes = strToBytes(s)
                if (bytes != null) { 
                    ip = InetAddress.getByAddress(bytes)
    //              println( "parsed ip: "+s)
                }
            } catch {
                case e:UnknownHostException =>
            }
            if (ip==null) {
                ip = InetAddress.getByName(s)
            }
            new Host(name, ip)
        }
    }
    

    随着这一变化,我的软件开始出现故障,分离的strToBytes中出现“java.lang.OutOfMemoryError:GC开销限制已超过”。我在这里做过记忆处理错误吗?

    我很欣赏对设计的任何评论。由于需要数组[byte]作为inetaddress.getbyaddress参数,我无法缩短解析时间。目标平台有scala 2.7.7。

    编辑 :我已经用假人替换了解析,发现我的程序稍后在其他地方仍然会失败一些兆字节的解析数据。每个替换字符串。split(s:string)with pattern.split(s:string)and precompiled pattern使其运行时间稍长。这并不能解决我的问题,但这个问题现在可以解决了。但我仍然需要设计评论。

    2 回复  |  直到 14 年前
        1
  •  4
  •   Vasil Remeniuk    14 年前

    implicit def strToBytes(s:String)= (for {separator <- separators find(_.matcher(s).find)} yield separatedStrToBytes(s, separator)) getOrElse null
    
    implicit def separatedStrToBytes(s:String, separator:Pattern) = s split separator.pattern map(Integer.parseInt(_).toByte)
    
    scala> import Host._
    import Host._
    scala> strToBytes("127.0.0.1")
    res9: Array[Byte] = Array(127, 0, 0, 1)