小编Amu*_*han的帖子

了解如果未调用release,Netty内存泄漏将如何发生

我已经阅读了各种StackOverFlow QA以及有关Netty内存泄漏的外部链接和博客,从ReferenceCountedObjectsManuallyHandlingReferenceCounting,BufferOwnership,TwitterBlog,ChannelOutboundHandlerFlushedBufferLeak以及源自这些页面的其他链接开始.

我理解如果应用程序在完成资源后不释放资源,实际内存本身将被GC,但Netty的池大小仍会增加并导致内存泄漏.

上面链接解释这一点的引用引用"即使缓冲区本身是垃圾收集,用于存储池的内部数据结构也不会.","PooledByteBufAllocator也使用Recycler来"汇集"ByteBuf容器(不是它指的是自己的记忆.)"

有人可以解释一下如何发生这种情况吗?如果ByteBuf是一个引用内存的容器,那么在ByteBuf仍然在Netty内存池中时如何收集内存?我想象Netty维护了一个ByteBuf(s)池,并在它的引用计数变为0时重用它所引用的内存.通过这个假设,我无法理解如果内存本身ByteBuf仍然存在于Netty的池中,它是如何被GC 的?

有人可以用简单的语言澄清一下吗?

memory-leaks netty

7
推荐指数
1
解决办法
402
查看次数

当配置映射更新时,如何在kubernetes中的应用程序内部获取通知

我有一个正在运行的应用程序,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)是一个符号链接,实际文件位于名为的文件夹中 …

go kubernetes configmap

5
推荐指数
1
解决办法
524
查看次数

如何访问代理的 grpc 服务中的请求标头。golang中的grpc网关

我有一个由 grpc-gateway 代理的 grpc 服务器。当我对网关端点进行 HTTP 调用时,会调用我对应的 grpc 服务方法。现在,grpc 服务实现接收一个具有标头的上下文。我不知道如何访问标题。

在此处输入图片说明

当我调试我的 grpc 服务并设置断点时,这是我的服务接收的 Context 对象的结构。现在,如何获取任何 HTTP 请求标头的值?

go grpc grpc-gateway

1
推荐指数
1
解决办法
2563
查看次数

如何创建任意长度的字符串

我想创建一个给定长度的虚拟字符串来进行性能测试。例如,我想首先使用 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)

我意识到这与编码有关。但是如何解决这个问题,以便我创建由给定长度的字节数组支持的任何字符串,以便当我通过网络写入它时,我生成预期的有效负载。

string go

0
推荐指数
1
解决办法
2156
查看次数

标签 统计

go ×3

configmap ×1

grpc ×1

grpc-gateway ×1

kubernetes ×1

memory-leaks ×1

netty ×1

string ×1