杰克逊写的价值太慢了

时间:2015-04-24 00:25:10

标签: java json jackson

我想从object创建JSON字符串。

$vms=Get-VM
$val = 0

Write-Host "This script is set up for quickly creating and initilizing VHDs"
$Path = Read-Host "Please enter the path you want to create the drives to. Use the formate in this example <E:\VHDS\>"
$fileName = Read-Host "The Drive will be <target>-<number>.vhdx.  Please Name the target "

$vhdSize = 1GB
$vmAmount = Read-Host "How many Drives should be attached to each VM?"

foreach ($vm in $vms)
{
    $n = $vm.Name

    while ($val -ne $vmAmount)
    {
        $vhdPath = ($Path + $fileName + '-' + $val + '.vhdx')
        New-VHD -Path $vhdPath -SizeBytes $vhdSize -Fixed | Mount-VHD -Passthru | Initialize-Disk -Passthru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume -FileSystem NTFS -Confirm:$false -Force | Dismount-VHD -Passthru
        Add-VMHardDiskDrive -VMName $n -Path $vhdPath 
        $val++
    }
}

某些对象很大,创建JSON字符串需要很长时间。 要创建8MB JSON字符串,它需要大约15秒。

我该如何改善这个?

1 个答案:

答案 0 :(得分:1)

确保你有足够的内存:用于存储8 MB序列化JSON的Java字符串需要大约16兆字节的连续内存。

但更重要的是:为什么要在内存中创建java.lang.String? 对于如此巨大的String有什么用?

如果您需要将JSON内容写入文件,则有不同的方法;类似地写入网络套接字。至少你可以将输出写为byte[](减少50%的内存),但在大多数情况下,增量写入外部流只需要很少的内存。

15秒绝对是非常慢的。在没有GC问题的情况下,在初始预热之后,Jackson应该在几分之一秒内写出8兆,对于由标准Java类型组成的简单对象,就像10-20毫秒。

修改

刚刚意识到在构造结果String期间,临时内存使用量也会加倍,因为构造String时缓冲内容尚未清除。所以8 MB需要至少32 MB来构造String。如果默认堆为64 MB,则无法正常工作。