Tag: 内存

如何以编程方式获取jmap直方图?

我想从受监控的应用程序内部以编程方式获得jmap -histo的输出。 我看到通过HotSpot诊断bean可以触发二进制堆转储,但我看不到如何获取直方图数据。 可能吗 ?

java8“java.lang.OutOfMemoryError:Metaspace”

在将我们的Java应用程序(在Tomcat上运行的服务)JRE从Java 7切换到Java 8之后,我们开始在运行高流量的几天后看到java.lang.OutOfMemoryError: Metaspace 。 堆使用没问题。 在性能测试期间执行相同的代码流之后,元空间会跳转。 可能导致元空间内存问题的原因是什么? 目前的设置是: -server -Xms8g -Xmx8g -XX:MaxMetaspaceSize=3200m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:MaxGCPauseMillis=1000 -XX:+DisableExplicitGC -XX:+PrintGCDetails -XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=7 -XX:NewSize=5004m -XX:MaxNewSize=5004m -XX:MaxTenuringThreshold=12 -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintFlagsFinal -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCCause -XX:+PrintAdaptiveSizePolicy -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=3 -XX:GCLogFileSize=200M 该应用程序也大量使用reflection。 我们还使用自定义类加载器。 所有这些都在java 7中运行良好。

即使对于小程序,Java内存使用率也很高

我有几个用java编写的简单应用程序,其中一个被编写为一个小部件。 甚至小应用程序使用多少内存让我感到惊讶。 我写了以下内容,看看它是否是我的程序中的错误,或者是一般的Java问题: public class ram { public static void main(String[] args){ while(true)System.out.print(“Hello World”);//while loop to give me time to check RAM usage } } 然后使用java ram编译并运行它,它给了我以下RAM使用情况: The process java (with pid 4489) is using approximately 43.3 MB of memory. 34460 KB [heap] 7088 KB /usr/lib/jvm/java-7-openjdk/jre/lib/amd64/server/libjvm.so 1712 KB /usr/lib/jvm/java-7-openjdk/jre/lib/rt.jar 136 KB [stack:4495] 120 KB /usr/lib/jvm/java-7-openjdk/jre/lib/amd64/libjava.so […]

Tomcat内存消耗超过堆+ permgen空间

我观察到操作系统所说的内容与jVisualVM所说的内容之间的Tomcat RAM消耗不匹配。 从htop开始,Tomcat JVM拥有993 MB的驻留内存 从jVisualVM,Tomcat JVM正在使用 堆最大值:1,070,399,488 B 堆大小: 298.438.656 B 堆使用:可变,介于170MB和270MB之间 PermGen Max:268,435,456 B PermGen尺寸: 248,872,960 B PermGen使用:略有变化,约150MB 从我的理解,操作系统内存消耗应该是堆大小+ PermGen大小〜= 522 MB。 但这比我观察到的要少471 MB 。 任何人都知道我在这里错过了什么? PS:我知道我的最大堆远远高于使用的,但我认为如果JVM不使用它(即堆大小较低)应该没有效果。 谢谢! 渣子

比较直接和非直接ByteBuffer get / put操作

从直接bytebuffer获取/放置非直接bytebuffer比获取/放入更快吗? 如果我必须从直接bytebuffer读/写,最好先读/写一个线程本地字节数组,然后用字节数组更新(写入)直接bytebuffer?

处理Java中的大型数据结构

我正在开发一个需要处理非常大的矩阵的Java应用程序。 例如,乘以两个1000万* 1000万个矩阵! 当然,即使存储这些矩阵中的一个,Java堆也没有足够的空间。 我该怎么办? 我应该使用数据库来存储我的矩阵并将每个所需的部分带入内存并将它们一个接一个地加倍吗?

线程消耗的内存

我需要监视由我的应用程序生成的线程消耗的内存量。 如果贪婪的线程消耗太多内存,那么我们的想法是采取纠正措施。 我已经提到我的java线程需要多少内存? 。 该链接的一个建议是在ThreadMXBean.使用getThreadAllocatedBytes ThreadMXBean. 我用以下工作试验了getThreadAllocatedBytes 。 List primes = new ArrayList(); long i = 0; while (true) { primes.add(++i); if ((i % 10) == 0) { primes.clear(); System.runFinalization(); System.gc(); } } 我花了很长时间在四个线程上运行这个工作。 虽然作业不会持续累积内存,但getThreadAllocatedBytes返回的值getThreadAllocatedBytes不断增加,甚至不会下降一次。 这意味着getThreadAllocatedBytes不会返回线程使用的堆上的实际内存量。 它返回自启动以来线程在堆上分配的内存总量。 我的平台详细信息如下: Linux PG85213.egi.ericsson.com 3.5.0-030500-generic#201207211835 SMP Sat Jul 21 21:35:55 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux java […]

使用jmx和java 5以编程方式获取堆信息

我知道使用jconsole附加到java进程以获取内存信息。 具体来说,我是以编程方式获取有关各种内存池的信息,因此我可以将其绑定到监视应用程序。 谢谢!

为什么-Xmx和Runtime.maxMemory不同意

当你添加 -Xmx????m 在命令行中,JVM为您提供了一个接近此值的堆,但最多可以输出14%。 JVM可以为您提供更接近您想要的数字,但只能通过反复试验。 System.out.println(Runtime.getRuntime().maxMemory()); 版画 -Xmx1000m -> 932184064 -Xmx1024m -Xmx1g -> 954728448 -Xmx1072m -> 999292928 -Xmx1073m -> 1001390080 我正在运行HotSpot Java 8 update 5。 很明显,堆可能只是超过1000000000但为什么这是-Xmx1073m而不是-Xmx1000m ? BTW 1g == 1024m ,这表明1g应该是1024 ^ 3,比1000 ^ 3高7%,但是你得到比1000 ^ 3低7%的东西。 被这么多关闭表明我错过了关于堆如何工作的基本信息。 如果我要求-Xmx1000m并且它是1001390080我不在乎,我会假设它需要遵守一些分配多个,但是给你932184064建议我堆比我想象的更复杂。 编辑我发现了 -Xmx1152m gives 1073741824 which is exactly 1024^3 所以看起来它比我在这种情况下要求的maxMemory()减少了128 MB。 BTW 128是我最喜欢的号码。 我今天参加了128号街道的会议,发言人引用了第128页的一本书;)

初始化VM时发生错误无法为对象堆保留足够的空间无法创建Java虚拟机

我在一个多月后面临这个问题,这是我在命令行上运行java时看到的: $ java -Xmx1300m Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine. 如果我用较少的内存运行它可以正常工作 $ java -Xmx1240m Usage: java [-options] class [args…] (to execute a class) or java [-options] -jar jarfile [args…] (to execute a jar file) ….. ….. 我花了一个星期试图调试这个并没有任何效果。 最后我让我的IT支持人员更换笔记本电脑。 这发生在一个月前的10月23日。 现在,一个月后,我的新系统又出现了同样的问题。 […]