写入套接字期间的Java字符串垃圾
Java任务控制显示写入SocketOutputStream期间生成的垃圾的MB写入套接字期间的Java字符串垃圾,java,string,sockets,garbage,Java,String,Sockets,Garbage,Java任务控制显示写入SocketOutputStream期间生成的垃圾的MB Stack Trace TLABs 'Total TLAB' Size(bytes) Pressure(%) java.util.Arrays.copyOfRange(char[], int, int) 37 34,002,872 65.245 java.lang.String.<ini
Stack Trace TLABs 'Total TLAB' Size(bytes) Pressure(%)
java.util.Arrays.copyOfRange(char[], int, int) 37 34,002,872 65.245
java.lang.String.<init>(char[], int, int) 37 34,002,872 65.245
java.lang.String.substring(int) 20 19,329,920 37.09
java.net.SocketOutputStream.socketWrite(byte[], int, int) 20 19,329,920 37.09
java.net.SocketOutputStream.write(byte[], int, int) 20 19,329,920 37.09
堆栈跟踪TLAB“总TLAB”大小(字节)压力(%)
copyOfRange(char[],int,int)37 34002872 65.245
java.lang.String.(char[],int,int)37 34002872 65.245
java.lang.String.substring(int)20 19329920 37.09
SocketOutputStream.socketWrite(字节[],int,int)20 19329920 37.09
java.net.SocketOutputStream.write(字节[],int,int)20 19329920 37.09
从外观上看,这是35MB的垃圾
我在Ubuntu 12.04上
/usr/lib/jvm/java-8-oracle/jre/bin/java-version
java版本“1.8.0_45”
Java(TM)SE运行时环境(build 1.8.0_45-b14)
Java HotSpot(TM)64位服务器虚拟机(构建25.45-b02,混合模式)
我在这里签入了OpenJDK
但是我没有看到任何相关的代码负责调用子字符串,所以Oracle的JVM在这里可能不同。
显然,我不能将JMC与OpenJDK进行比较
有什么原因需要这样解析IP地址吗?
有什么办法可以避免吗?您是如何判断解析IP地址的?这是在连接套接字时完成的,而不是在写入期间。Oracle在
socketWrite
中也不做任何字符串操作,所以我想知道您是如何得出stacktrace的。是不是度量本身引入了垃圾?可能一个探测器试图记录流量。Stacktrace是从JavaMissionControl获取的,我只是假设它将是IP+端口解析@比齐克洛普也在想这件事。可能是JMC向代码中注入了一些东西,以获取IP和端口的统计信息,以及传输了多少数据。我将尝试禁用该功能,看看这是否会导致difference@ivenhov当您到达SocketOutputStream
时,您已经打开了端口,并且正在使用FileDescriptor
写入流。您认为它将如何解析IP地址?这是在连接套接字时完成的,而不是在写入期间。Oracle在socketWrite
中也不做任何字符串操作,所以我想知道您是如何得出stacktrace的。是不是度量本身引入了垃圾?可能一个探测器试图记录流量。Stacktrace是从JavaMissionControl获取的,我只是假设它将是IP+端口解析@比齐克洛普也在想这件事。可能是JMC向代码中注入了一些东西,以获取IP和端口的统计信息,以及传输了多少数据。我将尝试禁用该功能,看看这是否会导致difference@ivenhov当您到达SocketOutputStream
时,您已经打开了端口,并且正在使用FileDescriptor
写入流。