因此,我知道对堆栈中分配的变量调用free()
会导致无效指针错误。
在malloc
ED指针中,malloc()
在实际指针之前分配8个字节,以保留关于指针大小的信息。因此,我想知道是否在一个结构之前做了一个长
,然后在该结构上调用free,是否可以释放该结构(当然,这偏离了分配这8个字节是malloc
所做的唯一额外的事情的假设)。
我想我的最后一个问题是,堆栈变量分配和堆分配之间是否有真正的区别(就后端对内核的调用而言)。
一些C实现可能会在分配的空间之前使用数据来帮助他们管理空间。有些人没有。有些人这样做是为了某些规模的分配,而不是其他的。如果他们这样做,它可能是八个字节,也可能是其他一些量。你不应该依赖这方面的任何行为。
当在块中声明long
对象和结构
时,编译器可能会将它们放在堆栈上,也可能不会将它们放在堆栈上。它可能会将long
放在struct
之前,或者反之亦然,或者,因为它优化了程序,它可能会将long
保存在寄存器中,而根本不将其放在堆栈中,并且它可能会执行其他操作。在一些C
实现中,长度
为8个字节。在有些情况下,情况并非如此。没有好的方法来确保两个独立的对象放在相邻的内存中。(您可以通过将它们放在一个更大的结构中来使它们不分离。)
即使您能够拼凑出一个long
后跟一个struct
,您怎么知道要在long
中放入什么值呢?C实现把分配的长度放进去了吗?还是指向另一个块的指针?还是C实现用来跟踪已分配内存的数据库的其他部分?如果malloc
和free
在分配的空间之前使用内存,则该内存不是空的。它需要有一些价值,你不知道那是什么。
是的,在堆栈上分配的内存和从堆中分配的内存之间存在差异。这超出了C向程序呈现的模型。但是,在进程具有堆栈和堆的系统中,它们通常位于进程内存的不同位置。特别是,堆栈内存必须在堆栈增长和收缩时保持可用。你不能把它和堆混在一起而不弄坏东西。
当你尝试各种事情时,询问会发生什么是很好的。然而,malloc
和free
的现代实现相当复杂,您必须将它们作为一种服务接受,而不能轻松地查看它们。相反,为了帮助您学习,您可以考虑以下内容:
>
如何编写自己的malloc
和free
?
你怎么能让所有这些工作?如何将兆字节分成块?如何记住哪些块是分配的,哪些是免费的?当有人打电话给myfree
,你怎么知道他们回馈了多少?当使用myfree
返回相邻的块时,如何将它们重新组合成更大的块?
我是分析Java记忆问题的新手。所以请原谅我这个问题看起来很天真 我在运行应用程序时设置了以下JVM参数: 我正在使用visualVM监控使用情况:以下是我看到的 问题是,即使应用程序没有接收任何要处理的数据,使用的内存也不会下降。当应用程序启动时,使用的空间开始变小(大约1GB),但随着应用程序的运行而增加。然后用过的记忆永远不会消失。我的问题是,为什么即使应用程序中没有发生重大处理,使用的堆内
问题内容: 我正在将Eclipse 3.6与Linux(64位)上的最新Sun Java 6配合使用,并具有大量的大型项目。在某些特殊情况下(例如,SVN更新),Eclipse需要多达1 GB的堆。但是大多数时候它只需要350 MB。当我启用堆状态面板时,大部分时间都会看到以下信息: 878M中的350M 我使用以下设置启动Eclipse:-Xms128m -Xmx1024m 因此,大多数情况下,
我有一个Springboot应用程序,Mule作为微服务在docker容器中运行。即使空闲时也需要大约700MB。注意到JVM分配了380 MB的堆,这是使用参数提供的最大堆。虽然分配了最大堆,但微服务在空闲时只使用大约50 MB。问题是如何从JVM释放未使用的内存。 似乎减少MaxHeapFreeRatio我们可以要求JVM在有更多可用内存时收缩。然而没有太大区别,JVM也没有释放内存。但是当我
问题内容: 我有一个带有以下参数的Java应用程序,但是即使总可用空间大于45%(可以通过可视VM看到),也无法回收堆。JVM是否有任何理由不释放该堆空间?与Java6中预期的设置相同。运行Java5运行时和编译时间 问题答案: 我们相信我们已经找到了答案。我们正在运行的系统是具有多个CPU的服务器级计算机,JRE正在检测多个CPU,并将GC设置为使用并行而不是串行GC,这与XX:MaxHeapF
问题内容: 我对Java不太了解。 我浏览了几个链接,发现博客上写着“ Java Primitives存储在堆栈上”,我觉得这取决于实例变量或局部变量。 经过几个链接后,我的结论是, 类变量(基元)作为对象包含的对象的一部分存储在堆中。 类变量– object(用户定义)–作为其包含的Object的一部分存储在堆中。对于参考对象和实际对象都是如此。 方法变量-基元-作为该堆栈框架的一部分存储在堆栈
这里是正确的代码,只更改为pre=null,cur=second。顺便说一下,在下一次迭代中pre=second和cur将变为second->next,这与上面给出的运行时解决方案相同。