根据此处和此处的示例,我设置了一个服务器和一个使用 TLS 和自定义证书的客户端。使用 pprof 分析一段时间内的内存使用情况表明,每次 TLS 客户端连接时,分配数量都会增加。查看日志,确实存在很多这样的条目:
# 0x5827cb math/big.nat.make+0x93b /usr/local/go/src/math/big/nat.go:68
# 0x58267e math/big.nat.mul+0x7ee /usr/local/go/src/math/big/nat.go:428
# 0x5780b8 math/big.(*Int).Mul+0x118 /usr/local/go/src/math/big/int.go:168
# 0x72d57b crypto/elliptic.(*CurveParams).addJacobian+0xf5b /usr/local/go/src/crypto/elliptic/elliptic.go:145
# 0x72ebe2 crypto/elliptic.(*CurveParams).ScalarMult+0x1c2 /usr/local/go/src/crypto/elliptic/elliptic.go:260
# 0x7c5934 crypto/tls.(*nistParameters).SharedKey+0xd4 /usr/local/go/src/crypto/tls/key_schedule.go:171
# 0x7c3d09 crypto/tls.(*ecdheKeyAgreement).processServerKeyExchange+0x1d9 /usr/local/go/src/crypto/tls/key_agreement.go:266
# 0x7a43e1 crypto/tls.(*clientHandshakeState).doFullHandshake+0x471 /usr/local/go/src/crypto/tls/handshake_client.go:503
# 0x7a3b9a crypto/tls.(*clientHandshakeState).handshake+0x3fa /usr/local/go/src/crypto/tls/handshake_client.go:399
# 0x7a21ec crypto/tls.(*Conn).clientHandshake+0x2cc /usr/local/go/src/crypto/tls/handshake_client.go:208
# 0x7a07fe crypto/tls.(*Conn).Handshake+0xee /usr/local/go/src/crypto/tls/conn.go:1343
# 0x7ca570 crypto/tls.DialWithDialer+0x220 /usr/local/go/src/crypto/tls/tls.go:156
# 0x8f2578 crypto/tls.Dial+0x1a8 /usr/local/go/src/crypto/tls/tls.go:180
# 0x8f2518 main.(*TCPSSLClient).Open+0x148 /home/audinate/vcx/tcpSslClient.go:39
Run Code Online (Sandbox Code Playgroud)
还有这些:
# 0x58364a math/big.nat.make+0x2ca /usr/local/go/src/math/big/nat.go:68
# 0x583507 math/big.nat.sqr+0x187 /usr/local/go/src/math/big/nat.go:570
# 0x578015 math/big.(*Int).Mul+0x75 /usr/local/go/src/math/big/int.go:164 …Run Code Online (Sandbox Code Playgroud)