Tag: 内存管理

如何用C#测量内存使用量(我们可以用Java做)?

我试图在C#程序中测量内存使用情况。 我想知道这个Java函数的C#等价物: ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getCommitted() 表示为堆分配的总内存。 我需要知道为C#programm分配的内存总大小。 然后在Java中我可以获得用过的内存: ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed() 目前我在C#中使用它来获取已用内存: Process_Memory = MyProcess.PrivateMemorySize64; 但我并不完全确定它是等同的。 那么在简历中如何获得我的C#应用​​程序的总分配空间以及当前t的当前使用? 编辑: 从答案和进一步研究中我确定了这个: 当前使用的内存 System.GC.GetTotalMemory(false); 给出当前在托管内存中分配的字节数。 ( http://msdn.microsoft.com/fr-fr/library/system.gc.gettotalmemory.aspx ) 这个方法返回一个低值,我很确定它并不是所有正在使用的内存的表示,因为我可以使用Java中的 getUsed() 。 在java中,对于相同的应用程序,使用的内存从5MB开始,最大为125MB。 使用C#,我使用上述方法从1到5 MB。 看起来 : MyProcess.PrivateMemorySize64; // return ~=25MB 要么 MyProcess.WorkingSet64; //return ~=20MB 为所有正在使用的内存提供更准确的值。 但我不知道应该使用哪一个…… 对于全局分配的内存, 本文建议使用: Process_MemoryEnd1 = MyProcess.VirtualMemorySize64; 它在程序中总是返回相同的值 ,大约169MB,与Java相比看起来很公平:从64MB到170MB最大 我仍然在寻找一个准确的答案,我发现它非常含糊,而且我对Windows内存管理不是很熟悉,我真的不确定我发现的文档:/

Java非阻塞内存分配

我在某处读到java可以为大约12个机器指令中的对象分配内存。 这对我来说非常令人印象深刻。 据我所知,JVM使用的一个技巧是以块的forms预分配内存。 这有助于最大限度地减少对操作系统的请求数量,这是非常昂贵的,我想。 但即便是CAS操作也可能在现代处理器上花费多达150个周期。 那么,有没有人可以解释java中内存分配的实际成本以及JVM用于加速分配的技巧?

Java虚拟机上的arrays分配和访问以及内存争用

观察线程子类的以下定义(为方便起见,整个可运行的Java源文件包含在问题的末尾): final class Worker extends Thread { Foo[] array = new Foo[1024]; int sz; public Worker(int _sz) { sz = _sz; } public void run() { //Foo[] arr = new Foo[1024]; Foo[] arr = array; loop(arr); } public void loop(Foo[] arr) { int i = 0; int pos = 512; Foo v = new Foo(); […]

Java – 堆与直接内存访问

我最近遇到了sun.misc.Unsafe类,允许用户以类似于C的方式分配,解除分配和一般访问内存。我读了几个解决这个问题的博客,例如 哪个更快 – 堆或直接内存 – 测试结果声称堆 堆外内存与DirectByteBuffer vs Heap – 堆外似乎是最快的 时间序列数据的内存映射文件 – MappedByteBuffer比堆对象更快 第1条似乎与其他条款相矛盾,我无法理解其中的原因。 DirectMemoryBuffer在引擎盖下使用了sun.misc.Unsafe (因此是MappedByteBuffer ),因此它们也应该受到第1条所述的JNI调用的影响。另外,在第2条中,堆外内存访问类似于第1条中的内容,并给出完全相反的结果。 有人可能会评论如何处理堆外记忆,即何时使用它,是否有显着的好处,最重要的是,为什么类似的主题根据上述文章给出了截然不同的结果? 谢谢。

JVM内存管理和垃圾收集书?

任何人都可以建议一本书 (或任何其他来源),它将彻底揭示JVM内存管理和垃圾收集的内部结构 (优化,工作,循环引用,pecularities,讨论各种JVM impls ……)? [到目前为止我发现的是单独的文章,专门讨论各个方面,但没有重要的内容:)。 Hotspot实现的一些好材料就在这里 。 ] 非常感谢您给予的任何建议。

为什么PermGen的空间越来越大?

我已经阅读了一些文章,我理解了以下内容(如果我错了,请纠正我和/或编辑问题): java堆是这样分段的: 年轻一代:创建的对象在这里,这部分经常和廉价的垃圾收集 老一代:在Young年代的垃圾收集中存活的对象进入这里,这个区域垃圾收集频率较低,并且使用更多CPU要求的过程/算法(我相信它被称为标记扫描) 编辑:如其他用户所述,PermGen不是名为heap的区域的一部分 PermGen:这个区域充满了你的app类元数据和许多其他不依赖于应用程序使用的东西。 所以,知道这一点……为什么我的PermGen空间会在应用程序负载过重时增长? 对于我之前所说的这个空间不应该在应用程序加载的情况下逐渐填充,但正如我在开始时所说的那样,我可能错误地做了一些假设。 事实上,如果PermGen空间不断增长,有没有一种垃圾收集或重置的方法呢?

Java 6过多的内存使用

Java 6是否比大预期的应用程序消耗更多的内存? 我有一个我已经开发多年的应用程序,直到现在我的特定测试配置大约需要30-40 MB; 现在使用Java 6u10和11,它在活动时需要几百个。 它反弹很多,在50M到200M之间的任何地方,当它空转时,它会执行 GC并将内存放下。 此外,它还会产生数百万的页面错误。 所有这些都是通过Windows任务管理器观察到的。 因此,我在我的探查器(jProfiler)下使用jVisualVM运行它,并且它们都表明通常适度的堆和大约30M的perm-gen用法组合,即使在完全活动进行负载测试循环时也是如此。 所以我很神秘! 它不只是从Windows虚拟内存池请求更多内存 – 这显示为200M“内存使用”。 澄清:我想对此非常清楚 – 使用Java VisualVM在18小时内观察到类堆和perm gen堆已经非常稳定。 分配的易失性堆(eden和tenured)位于16MB(它在前几分钟内达到)不动,并且这个内存的使用波动在一个完美的模式,从8MB到16MB均匀增长,此时GC启动将它降回8MB。 在这18个小时的时间内,自从我进行压力测试以来,系统处于恒定的最大负载下。 在许多运行中都可以看到这种行为完美且一致的可重复性。 唯一的exception现象是,当通过任务管理器观察从Windows获取的内存时,从64MB到900 + MB的所有地方都会出现波动。 更新2008-12-18:我用-Xms16M -Xmx16M运行程序没有任何明显的不利影响 – 性能很好,总运行时间大致相同。 但是短时间内的内存使用率仍然达到了180M左右。 更新2009-01-21:似乎答案可能是线程数 – 请参阅下面的答案。 编辑:我的意思是数以百万计的页面错误 – 在30M +的范围内。 编辑:我有一台4G机器,所以200M在这方面并不重要。

Java堆栈和堆内存管理

我想知道如何在以下程序中分配内存: public class MemoryClass { public static void main(final String[] args) { int i = 0; MemoryClass memoryClass = new MemoryClass(); memoryClass.myMethod(memoryClass); } private void myMethod(final Object obj) { int i = 1; String s = “HelloWorld!”; } } 现在,就我的理解而言,下图描述了内存分配的发生方式: 在上图中,堆栈存储器中的内存 , obj和s实际上是对它们放置在堆内存中的“ 实际对象 ”的引用。 以下是我想到的一系列问题: 存储的方法在哪里? 如果我在myMethod创建了另一个MemoryClass对象,JVM会在堆栈内存中再次为相同的方法分配内存吗? 如果JVM执行完成,JVM是否会释放分配给myMethod的内存,如果是这样,它将如何管理问题2中提到的情况( 仅当JVM多次为同一方法分配内存时才适用 )。 如果我只声明了s并且没有初始化它,那么JVM是否仍会为java.lang.String类的所有方法分配内存,如果是这样,为什么呢?

内存如何分配以及存储在哪里? :Javainheritance

您好我有一个特定的Javainheritance问题。 以下是我的代码 class Parent{ int x = 5; public void method(){ System.out.println(“Parent”+ x); } } public class Child extends Parent{ int x = 4; public void method(){ System.out.println(“Child”+ x); } public static void main(String[] args){ Parent p = new Child(); System.out.println(((Child) p).x); System.out.println(px); } } 现在我的问题是在运行此程序时实际发生在幕后的情况。 什么得到inheritance? 在记忆位置的哪里? 为什么第一个syso给出4,第二个给出5?(这个我能在某种程度上理解,但对上面两个的澄清将有助于更清楚地理解它) 请指导

Java应用程序使用的资源在终止时是否被释放?

Java应用程序可能使用IO流,套接字或数据库连接,这些连接应在不再需要时关闭。 但是,可以终止应用程序(例如,通过终止该过程)。 在这种情况下,是否会释放所有使用过的资源? 谁将释放他们:OS或JRE?