Java字符串#split()-创建内存泄漏

Java字符串#split()-创建内存泄漏,java,memory-management,Java,Memory Management,无法理解java.lang.String的split方法如何导致内存泄漏? 示例- private boolean isValidHostName(String hostName) { ValidationHandler handler = ValidationHandler.INSTANCE; boolean isValid = hostName != null && (hostName.toLowerCase(ENGLISH).star

无法理解
java.lang.String
split
方法如何导致内存泄漏? 示例-

private boolean isValidHostName(String hostName)
{
    ValidationHandler handler = ValidationHandler.INSTANCE;
    boolean isValid =
            hostName != null && (hostName.toLowerCase(ENGLISH).startsWith("ws://") || hostName
                    .toLowerCase(ENGLISH).startsWith("wss://"));
    if (isValid)
    {
        @SuppressWarnings("null")
        String[] splits = hostName.split("//");
        if (splits.length == 2)
        {
            if (splits[1].indexOf(":") != -1)
            {
                splits = splits[1].split(":");
                try
                {
                    int portNum = Integer.parseInt(splits[1]);
                    isValid = (handler.validateIpAddress(splits[0]) || handler
                            .validateDomain(splits[0], false)) && (portNum >= 0
                            && portNum <= 65535);
                }
                catch (NumberFormatException e)
                {
                    isValid = false;
                }

            }
            else
            {
                isValid = handler.validateIpAddress(splits[1]) || handler
                        .validateDomain(splits[1], false);
            }
        }
        else
        {
            isValid = false;
        }
    }
    if (!isValid)
    {
        errorStrBuilder.append("\nInvalid hostname specified.");
    }

    return isValid;
}
专用布尔值isValidHostName(字符串主机名)
{
ValidationHandler=ValidationHandler.INSTANCE;
布尔值是有效的=
hostName!=null&(hostName.toLowerCase(英语).startsWith(“ws://”)hostName
.toLowerCase(英语).startsWith(“wss:/”);
如果(有效)
{
@抑制警告(“空”)
String[]splits=hostName.split(“/”);
如果(拆分长度==2)
{
if(拆分[1].indexOf(“:”)!=-1)
{
拆分=拆分[1]。拆分(“:”);
尝试
{
int-portNum=Integer.parseInt(拆分[1]);
isValid=(handler.validateIpAddress(splits[0])|| handler
.validateDomain(拆分[0],false))&&(portNum>=0

&&portNum我从未遇到过
split()
本身导致内存泄漏的说法


如果他们指的是
substring()
指的是原始
char[]
(因为
split()
在内部使用
子字符串),这已在中更改,因此,除非您运行的是旧版java,否则这也不应该是问题。

为什么您说它会导致内存泄漏?可能只是我没有跟上,但我想了解更多信息以便理解您的问题。尝试在internet上查找,找不到任何关于字符串的讨论#split()。每个人都在谈论字符串#subString()。我正在使用Parasoft进行代码分析,它给出的错误类似于-已知“split()”方法会导致内存泄漏。请检查其使用情况,以确保在这种情况下不可能出现内存泄漏。这听起来像是代码分析工具中的错误。您上面发布的代码不会导致内存泄漏。“检查其使用情况以确保在这种情况下不可能发生内存泄漏”意味着
String.split()
有时会导致内存泄漏,但有时也没问题。这是一种很好的情况。我的意思是,如果字符串中的字符没有重合,我想使用split方法可能会表现出奇怪的行为,这可能就是原因所在。但在您的特定情况下,我看不到任何内存泄漏问题。似乎是这样,所以不是这样她的案例是一个分析工具传播古老的神话。其中最有趣的部分是建议的解决方案,即分析代码。一个简单地搜索方法调用发生情况的分析工具,建议手动执行真正的分析,其价值何在…