标签: heap

在malloc期间内核中会发生什么?

我在接受采访时被问到这个问题.他们想知道的是当用户调用malloc(4)来分配4个字节的内存时,操作系统(Linux)如何响应?哪个子系统响应此系统调用?

我告诉他malloc()将由内存管理子系统提供服务.malloc()实现将遍历空闲内存(物理内存)列表,我们将其称为空闲列表,并找到大于或等于4字节的适当块.一旦找到这样的块,它将从空闲列表中删除并添加到使用的列表中.然后,该物理内存将映射到进程堆vma结构.他似乎对这个答案并不满意.伙伴系统如何适应这个?任何帮助将不胜感激.

c linux heap system process

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

如何在堆数据结构中删除?

我理解如何从最大堆中删除根节点,但是是否从中间删除节点以重复删除和替换根,直到删除所需节点为止?

  1. O(log n)是此过程的最佳复杂性吗?

  2. 这是否会影响大O复杂性,因为必须删除其他节点才能删除特定节点?

algorithm heap data-structures

45
推荐指数
2
解决办法
6万
查看次数

当程序退出时,是否有理由在C++中调用delete?

main例如,在我的C++ 函数中,如果我有一个指向使用堆内存的变量的指针(而不是堆栈内存) - 在我的应用程序退出后会自动解除分配吗?我会这么认为.

即便如此,即使您认为永远不会在退出时自动释放内存的情况下使用堆分配,也总是删除堆分配是一种好习惯吗?

例如,这样做有什么意义吗?

int main(...)
{
    A* a = new A();
    a->DoSomething();
    delete a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想也许以防我重构(或其他人重构)代码并将其放在应用程序的其他地方,这delete真的是必要的.

除了Brian R. Bondy(其中特别谈到C++中的含义)的答案之外,Paul Tomblin 对C特定问题也有一个很好的答案,该问题也讨论了C++析构函数.

c++ heap memory-management dynamic

44
推荐指数
5
解决办法
2万
查看次数

永久增加java堆大小?

有没有办法可以在我自己的计算机上设置jvm的默认堆大小?我想将它设置为1g,因为我总是运行自定义程序,它总是在默认的jvm大小中达到过剩点.

每次我从命令行运行我的java应用程序时,我都不想记得键入-XmX1g ...

必须有一个管理方式来做到这一点吗?

java heap size jvm-arguments

43
推荐指数
4
解决办法
9万
查看次数

是否有具有固定容量和自定义比较器的PriorityQueue实现?

相关问题:

我有一个非常大的数据集(超过500万件),我需要从中获得N个最大的项目.最自然的方法是使用堆/优先级队列,只存储前N个项目.JVM(Scala/Java)的优先级队列有几个很好的实现,即:

前2个很好,但它们存储了所有项目,在我的情况下会产生关键的内存开销.第三个(Lucene实现)没有这样的缺点,但正如我从文档中看到的那样,它也不支持自定义比较器,这对我来说没用.

所以,我的问题是:是否有PriorityQueue实现固定容量自定义比较

UPD.最后,根据Peter的回答,我创建了自己的实现:

public class FixedSizePriorityQueue<E> extends TreeSet<E> {

    private int elementsLeft;

    public FixedSizePriorityQueue(int maxSize) {
        super(new NaturalComparator());
        this.elementsLeft = maxSize;
    }

    public FixedSizePriorityQueue(int maxSize, Comparator<E> comparator) {
        super(comparator);
        this.elementsLeft = maxSize;
    }


    /**
     * @return true if element was added, false otherwise
     * */
    @Override
    public boolean add(E e) {
        if (elementsLeft == 0 && …
Run Code Online (Sandbox Code Playgroud)

java heap scala priority-queue

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

堆栈和堆内存的大小

可能重复:
堆栈和堆的内容和位置是什么?

关于ac程序中内存布局的基本概念,我理解:

  • 该语言使用两个主要数据结构堆栈.
  • 创建堆栈以存储子程序的局部变量和簿记数据
  • 创建堆以存储程序的动态分配变量
  • 堆本质上是可变长度的.(在堆栈上不太确定)
  • 通常,编译器/语言负责在执行之前请求OS创建这些数据结构.

问题

  • 堆栈/堆的初始大小是多少?谁来决定呢?
  • 在哪里创建物理内存?我看到一般描述为"在顶级地址中创建堆栈,在低级别地址创建堆"请详细说明

c heap stack memory-management

43
推荐指数
4
解决办法
6万
查看次数

无效的堆地址和致命信号11

我的应用程序经常会崩溃,我的日志会显示为:

@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree
Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)
Run Code Online (Sandbox Code Playgroud)

有时code=2,但总是Fatal signal 11invalid heap address.

我已经尝试过研究这意味着什么,以及如何解决它.这个帖子最有帮助 ; 但是,我仍然没有解决方案.

当我运行几个AsyncTasks下载多个图像时,会发生错误.

这是我的主要 AsyncTask

public class FetchArtistImages extends AsyncTask<Void, Integer, String[]> implements Constants {

private final WeakReference<Context> contextReference;

public FetchArtistImages(Context context) {
    contextReference = new WeakReference<Context>(context);
}

@Override
protected String[] doInBackground(Void... params) {
    String[] projection = new String[] {
            Audio.Artists._ID, Audio.Artists.ARTIST
    };
    String sortOrder = Audio.Artists.DEFAULT_SORT_ORDER;
    Uri uri = …
Run Code Online (Sandbox Code Playgroud)

heap android android-asynctask

42
推荐指数
2
解决办法
4万
查看次数

当Jenkins在Ubuntu上作为守护进程运行时,如何为Jenkins提供更多堆空间?

我的Jenkins作业内存不足,java.lang.OutOfMemoryError在构建日志中发送消息.但我使用Ubuntu软件包管理器,aptitude或者apt-get安装Jenkins,我不知道在哪里可以改变分配给Jenkins的堆空间量.

java heap ubuntu out-of-memory jenkins

42
推荐指数
3
解决办法
7万
查看次数

如何针对构建持续时间和RAM使用优化gradle构建性能?

我目前正在从我的多模块Web应用程序的ant转换为gradle,目前似乎当前版本的Gradle(M9)可能正在运行它的极限.但也许(希望)这只是一个问题,我不能理解Gradle的概念,或者不了解"魔术性能提升开关".我很高兴有关如何优化构建性能的任何暗示.

问题:在compileJava显示第一个问题之前经过几分钟,即使源中没有任何变化,该过程至少运行7分钟,直到它在中途崩溃:testClasses(在不同的子项目中),并显示以下消息:

* What went wrong:
Could not resolve all dependencies for configuration ':mysubproject_X:testRuntime'.
> Java heap space
Run Code Online (Sandbox Code Playgroud)

该项目由大约30个(部分相互依赖的)子项目组成,它们的build.gradle或多或少相同,用于从每个子项目构建jar文件,例如

sourceSets {

    main {
        java {
            srcDirs 'src'
        }
    }
}

dependencies {

    compile project(':mysubproject_A')
    compile project(':mysubproject_B')
    compile project(':mysubproject_E')

    compile group: 'commons-lang', name: 'commons-lang', version: '2.2'

}

// copy all non-java files from src
copy {
    from sourceSets.main.java.srcDirs
    into "$buildDir/classes/main"
    exclude '**/*.java'
}

jar {
}
Run Code Online (Sandbox Code Playgroud)

我试图通过将最大内存大小增加到1024M来解决堆空间问题,但它没有帮助.我的main build.gradle文件如下所示:

            sourceCompatibility = 1.6
            version = 0.5

            useFindBugs = false …
Run Code Online (Sandbox Code Playgroud)

heap performance build gradle

39
推荐指数
4
解决办法
7万
查看次数

所有静态成员都存储在哪里?

我正在尝试学习C#如何管理内存.我坚持使用静态元素,我阅读了很多关于这个主题的博客和文章,但我找不到一个相当令人满意的答案.

让我们定义一个代码块来帮助找到答案.

class myClass
{
    static string myStr = "String Data";
    static int myInt = 12;
}
Run Code Online (Sandbox Code Playgroud)

在你们分享你的答案之前,让我分享一下我对这个主题的了解.随意同意或不同意,并帮助我找到正确的答案.

  • 静态只是一生.
  • 静态引用类型(myStr)将在堆上运行一生.
  • 静态值类型(myInt)将在堆栈中持续一生.

让我感到困惑的是,我在互联网上找到的关于这个主题的一些答案.

混乱1号:

程序启动时,会将所有相关程序集加载到AppDomain中.加载程序集时,将调用所有静态构造函数,包括静态字段.他们将住在那里,卸载它们的唯一方法是卸载AppDomain.

在上面的行中,明确提到存储在AppDomain上的所有静态元素.那么为什么互联网上的每个人都说"静态"元素存储在堆/堆栈上?

困惑2:

每个静态变量都存储在堆上,无论它是在引用类型还是值类型中声明.

如果每个静态变量都存储在堆上.那么为什么有些人说值类型静态变量存储在堆栈上?

请帮助我连接点以了解C#中静态变量的内存管理.非常感谢你宝贵的时间:)

.net c# heap stack static

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