我已经阅读了各种StackOverFlow QA以及有关Netty内存泄漏的外部链接和博客,从ReferenceCountedObjects和ManuallyHandlingReferenceCounting,BufferOwnership,TwitterBlog,ChannelOutboundHandlerFlushedBufferLeak以及源自这些页面的其他链接开始.
我理解如果应用程序在完成资源后不释放资源,实际内存本身将被GC,但Netty的池大小仍会增加并导致内存泄漏.
上面链接解释这一点的引用引用"即使缓冲区本身是垃圾收集,用于存储池的内部数据结构也不会.","PooledByteBufAllocator也使用Recycler来"汇集"ByteBuf容器(不是它指的是自己的记忆.)"
有人可以解释一下如何发生这种情况吗?如果ByteBuf是一个引用内存的容器,那么在ByteBuf仍然在Netty内存池中时如何收集内存?我想象Netty维护了一个ByteBuf(s)池,并在它的引用计数变为0时重用它所引用的内存.通过这个假设,我无法理解如果内存本身ByteBuf仍然存在于Netty的池中,它是如何被GC 的?
有人可以用简单的语言澄清一下吗?
我有一个正在运行的应用程序,kubernetes其中有一个通过挂载的文件configmaps。现在,从应用程序内部,我想在此文件(来自configmap)更新时(通过kubectl update configmaps xyz命令说)执行一些操作。
可以说我使用以下命令创建了一个configmap:
kubectl create configmap myy-config --from-file=config.json
Run Code Online (Sandbox Code Playgroud)
我有这样创建我的部署:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: myapp
spec:
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
-
image: "xyz"
name: myapp
ports:
-
containerPort: 5566
volumeMounts:
-
mountPath: /myapp/config
name: config
dnsPolicy: ClusterFirstWithHostNet
volumes:
-
name: config
configMap:
name: my-config
Run Code Online (Sandbox Code Playgroud)
现在,如果kubectl exec -it <pod> sh可以,我可以看到该文件。如果我使用configmap编辑kubectl edit configmap my-config并更改内容,则在pod中运行的应用程序不会收到文件更改通知。我正在为该应用程序使用GO Lang,/myapp/config/config.json即使我看到编辑后文件已更改,它也没有收到文件上的fsnotify 。
当然,如果我在笔记本电脑上运行相同的应用程序,则代码会得到fsnotify,并且我的应用程序会更新其配置。来自kubernetes的相同代码与来自configmap的文件相同,它不起作用。我已阅读其他SOF问题,像这样的和各种其他人,但没有专门对这个问题我脸上的解决方案。
我了解该文件(来自configmap)是一个符号链接,实际文件位于名为的文件夹中 …
我有一个由 grpc-gateway 代理的 grpc 服务器。当我对网关端点进行 HTTP 调用时,会调用我对应的 grpc 服务方法。现在,grpc 服务实现接收一个具有标头的上下文。我不知道如何访问标题。
当我调试我的 grpc 服务并设置断点时,这是我的服务接收的 Context 对象的结构。现在,如何获取任何 HTTP 请求标头的值?
我想创建一个给定长度的虚拟字符串来进行性能测试。例如,我想首先使用 1 KB 的字符串进行测试,然后可能是 10 KB 的字符串等。我不在乎它填充的是哪个字符(或符文?)。我知道 Go 中的字符串是由字节数组支持的。因此,我希望最终的字符串由大小等于 1 KB 的字节数组支持(如果我给出 1024 作为参数)。
例如,我尝试了下面的暴力破解代码:
...
oneKBPayload := createPayload(1024, 'A')
...
//I don't mind even if the char argument is removed and 'A' is used for example
func createPayload(len int, char rune) string {
payload := make([]byte, len)
for i := 0; i < len; i++ {
payload = append(payload, byte(char))
}
return string(payload[:])
}
Run Code Online (Sandbox Code Playgroud)
它产生的结果是(10 长度)
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000AAAAAAAAAA"
Run Code Online (Sandbox Code Playgroud)
我意识到这与编码有关。但是如何解决这个问题,以便我创建由给定长度的字节数组支持的任何字符串,以便当我通过网络写入它时,我生成预期的有效负载。