标签: garbage

映射允许putIfAbsent而不创建密钥已存在时的值

我想使用一个相当于ConcurrentMap(我想要相当于putIfAbsent方法)的地图,但这不会强迫我事先创建对象.

例如,当我这样做时:

m.putIfAbsent( key, new CyclingArray() );
Run Code Online (Sandbox Code Playgroud)

我可能最终创建一个新的CyclingArray(无论是什么)对象.

当然,我意识到我可以锁定整个地图,但这将击败整个地图ConcurrentMap.

在概念上可以做以下工作吗?

   m.putIfAbsent( key, new Callback<CyclingArray>() {
     @Override
     public CyclingArray provide() {
       return new CyclingArray();  // only called if the key wasn't already present
     }         
   }
Run Code Online (Sandbox Code Playgroud)

你知道任何提供地图的图书馆:

  1. 提供一个类似ConcurrentMap提供的"接口",包括一个putIfAbsent方法.
  2. 只锁定我们将要使用的段(例如,ConcurrentHashMap实现)
  3. 当且仅当密钥不存在时才允许可选地创建值,从而避免无用的垃圾生成.
  4. 不会强迫我首先使用containsKey然后使用putIfAbsent,因为这也会以某种方式违背putIfAbsent的目的.

请注意,我不是在问上面的例子是否可以使用ConcurrentMap(它不能是AFAIK).

我正在考虑使用回调版本扩展ConcurrentHashMap和重载putIfAbsent,但遗憾的是ConcurrentHashMap内部使用了最终的Segment类.

在重新发明轮子之前,我想知道是否有任何地图已经提供了类似的功能.

java concurrency map garbage

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

数组丢弃值,拾取垃圾

将值放入我的数组后,一步之后(感谢gdp)数组包含垃圾.之后的唯一步骤是将参数传递给函数:

struct Vertex;
typedef struct Vertex Vertex;
struct Vertex {
    int sides[2][LENGTH];
    int ends[2];
    Vertex *children;
    Vertex *parent;
};

void move(Vertex *node, int side, int place) {
(38) int handfull = (*node).sides[side][place];
.....
}

int blah(Vertex *node, int side) {
.....
(103)    *((*node).children + i) = init_child(node);
(104)    move((*node).children + i, side, i);
(105)    blah((*node).children + i, opposingside);
.....
}
Run Code Online (Sandbox Code Playgroud)

gdb告诉我以下内容:

(gdb) print (*node)
$7 = {sides = {{5, 5}, {0, 5}}, ends = {0, 1}, 
children = 0x7fffffffdfa0, parent …
Run Code Online (Sandbox Code Playgroud)

c arrays struct gdb garbage

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

为什么在声明期间存储垃圾值?

我多次听说过,如果你没有初始化变量,那么garbage value就存储在变量中.

int i;
printf("%d",i);
Run Code Online (Sandbox Code Playgroud)

上面的代码打印任何垃圾值,但我想知道如果未初始化,存储垃圾值需要什么?

c variable-declaration garbage

2
推荐指数
3
解决办法
2463
查看次数

Delphi app中的内存泄漏.如何正确处理对象和字符串?

我的问题是关于调试内存泄漏,这似乎是一场噩梦.
在我的应用程序中有一个简单的类派生自TObject.该类的所有对象都存储在派生自TObjectList以下类的类的集合/列表中:

type
  TOffer = class(TObject)
    Item: string;
    Price: string;
    Id: string;
  end;

  TOffers = class(TObjectList<TOffer>)
  protected
    procedure SetOffer(I: Integer; AOffer: TOffer);
    function GetOffer(I: Integer): TOffer;
  public
    property Offers[I: Integer]: TOffer read GetOffer write SetOffer
  end;
Run Code Online (Sandbox Code Playgroud)

使用场景:
爬虫下载商品,解析商品并保存到对象集合.这种方法似乎很方便,因为我可以稍后引用这些对象(填充网格/列表,将它们写入文件等)

问题是正确处理对象以避免内存泄漏.该应用程序在启动时分配~4Mb内存,但在处理后~12k提供它吞噬32Mb.在过程完成后由未正确处理的对象/变量引起的泄漏.

ReportMemoryLeaksOnShutdown 显示可怕的数字,但关键是 - 我不知道在哪里看,以及如何正确调试该死的东西.

另一个例子是var MyString: string需要适当处置的变量!! 这对我来说很有见地:)我认为每个过程/函数都会自动管理超出范围的变量的垃圾收集.

商品列表由函数创建:

function GetOffersList: TOffers;
begin
  Result := TOffers.Create;
  while not rs.EOF do
  begin
    Offer := TOffer.Create;
    try
       // here come collected offer attributes as variables of …
Run Code Online (Sandbox Code Playgroud)

delphi memory-leaks garbage resource-disposal

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

可以强制对象在Gen 1或Gen 2中而不是在Gen 0中进行垃圾回收吗?

一位采访者问我一个奇怪的问题,我无法找到答案.

是否可以强制对象在Gen 1或Gen 2中而不是在Gen 0中进行垃圾回收?

.net c# garbage-collection garbage

2
推荐指数
2
解决办法
996
查看次数

由从未引用的对象创建的垃圾

是否从未引用的对象创建了任何垃圾?

我想到的例子是使用静态工厂方法创建一个对象,然后让该对象执行一个函数,但从不创建对它的引用.

例如:

LoggerFactory.getLogger(Foo.class).info("logging some stuff");
Run Code Online (Sandbox Code Playgroud)

这只是在eden空间中创建一个未引用的对象,一旦下一个集合发生就会被垃圾收集吗?

java garbage-collection garbage

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

从Lua中的表中删除Metatables

我想从表中"解开"一个元表,并想知道是否:

tbl = setmetatable(tbl, false) -- or nil
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?我找不到任何有关如何正确执行此操作的信息.我需要使用赋值运算符吗?

另外,如果metatable从未有过引用并且是匿名的话,这是否足以破坏附加到表的元表?:

tbl = setmetatable({}, {__index = something})
-- later on:
tbl = nil
Run Code Online (Sandbox Code Playgroud)

垃圾收集器就足以删除两个表?

lua garbage metatable

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

通过在未初始化的数据段 (bss) 中打印“垃圾值”,我们可以映射出先前程序中的所有值

我有一个奇怪的问题,我不确定我是否能够解释它,但我们开始吧。在学习 C 并使用它时,您通常会遇到术语“垃圾”或“垃圾”值,我的第一个问题是,该内存地址中的数据是来自某个不同程序或其他任何东西的数据,还是实际上是一些“随机'值,如果我认为那个内存地址中的剩余值是真的,为什么我们仍然能够从这样的内存地址读取,我的意思是假设我们只是声明了 int x; 现在它存储在某个内存地址的 bss 中,我们要输出它的值,我们将获得驻留在该地址上的值,所以如果我说的所有事情都是真的,

c memory memory-management garbage

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

为什么第二个printf打印垃圾值

这是源代码

#include <stdio.h>
#include <stdlib.h>

int *fun();

int main()
{  
    int *j;
    j=fun();
    printf("%d\n",*j);
    printf("%d\n",*j);
    return 0;
}

int *fun()
{
    int k=35;
    return &k;
}
Run Code Online (Sandbox Code Playgroud)

输出 -

35
1637778
Run Code Online (Sandbox Code Playgroud)

第一个printf()打印35,这是k的值

在main()中,第二个printf打印垃圾值而不是打印35.为什么?

c garbage

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

经常调用的方法中的新临时变量

在非常频繁调用的方法中设置新的临时变量会更有效吗?(> 1000x s)

所以目前的例子.我正在分配3个新的整数值,而是将这些值直接传递给另一个方法.

// What I'm currently doing
public virtual byte GetByte(Vector3 worldPos) {
    worldPos -= transform.position;
    int x = Mathf.FloorToInt(worldPos.x);
    int y = Mathf.FloorToInt(worldPos.y);
    int z = Mathf.FloorToInt(worldPos.z);
    return GetByte(x, y, z);
}
Run Code Online (Sandbox Code Playgroud)

但直接传递这些值会更有效,而不是分配3个新变量吗?

// would this be more efficient?
public virtual byte GetByte(Vector3 worldPos) {
    worldPos -= transform.position;
    return GetByte(
        Mathf.FloorToInt(worldPos.x),
        Mathf.FloorToInt(worldPos.y),
        Mathf.FloorToInt(worldPos.z));
}
Run Code Online (Sandbox Code Playgroud)

c# garbage-collection garbage

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