0

假设我们有一个APIView这样的返回大型查询集。我可以通过这样做最大限度地减少垃圾收集器的工作吗?

class MyView(APIView) 
  def get_list(self, request, format=None):
    params=request.query_params
    result = MyModel.objects.all()
    serializer = MyModelSerializer(result, many=True)
    del result #deleting explicitly here
    del params #deleting explicitly here
    return Response(serializer.data, status=status.HTTP_200_OK)

我读到gc.collect()在每个请求中调用不是一个好主意。这是一个好主意,以便垃圾收集器收集垃圾的东西更少吗?

4

1 回答 1

1

首先,您的 del 语句不会做任何事情,因为这些变量引用的对象有其他指向它们的引用。

其次,即使不是这种情况,del 语句也会删除一个变量,但不会垃圾收集它所引用的数据。

最后,自动垃圾回收旨在让开发人员不必显式释放内存。用垃圾收集语句给你的代码添乱会 a) 阻碍最佳垃圾收集算法,并且 b) 会降低代码的可读性。

说了这么多,我遇到了所有迹象都指向垃圾收集器的性能故障排除情况,并且很想添加一个显式的垃圾收集语句。通常,即使这项措施在短期内有所帮助,问题也会在某个时候再次出现。

至少在微服务领域,垃圾收集问题的现代解决方案包括完全禁用垃圾收集以及在达到某个内存阈值时关闭/重新启动进程。

于 2019-02-13T07:06:46.727 回答