我正在研究java,我记得在某处读到java对象在JVM内部有一些开销,虚拟机出于管理原因使用了这些开销。所以我的问题是,谁能告诉我是否以及如何在HotSpotJVM中获取对象的总大小,以及它可能带来的任何开销? 最佳答案 您无法直接获得开销。开销的数量取决于实现,并且可能因许多因素而异(例如,准确的JVM版本,以及您使用的是32位还是64位JVM)。但是可以相当安全地假设,在HotSpot等典型的现代JVM实现中,每个对象的开销在8到16个字节之间。数组的开销通常比其他对象大4个字节(包含整数数组长度)。另见:InJava,wha
我们的JVM消耗的内存比预期的要多。我们做了一些分析,发现没有泄漏。使用的堆内存最大达到2.9GB,但在空闲时间下降到800MB。但是提交的堆增加到3.5GB(有时是4GB)并且永远不会下降。同样在空闲时间之后,当使用的堆从800MB增加时,提交的堆内存从3.5GB增加。所以我们的服务器很快就会达到最大内存大小,我们必须每隔一天重新启动它们。我的问题是我的理解是,提交的堆内存是当前分配的内存。当使用的堆内存减少时,为什么提交的内存也没有减少?当使用的堆内存从其级别(800MB)增加时,提交的堆内存也从其级别(从3.5GB)增加我们的服务器中有以下内存设置:-Xmx4096M-Xms15
当jvm(在我的例子中是热点)将某些代码路径永久编译为机器代码时,该机器代码存储在哪里?在进程内存的.text段中?在进程的堆中??我不是在谈论JITing。据我了解,JIT将编译和运行字节码,而无需将编译后的代码保存在任何地方。但是当jvm保存该代码时呢?它在进程空间中的哪个位置保存它呢?...正如评论和答案所指出的,我所要求的一切实际上都是JIT的一部分。编辑:根据我在下面的评论,我特别提到的情况在此处记录为“自适应优化”:http://www.oracle.com/technetwork/java/whitepaper-135217.html#hotspot
我遇到的问题是我的应用程序使用的内存只有100MB,之后它减少了50MB,但是在窗口任务管理器上它显示150MB并且总是保持或增加而不是减少,我们如何reducetask管理器上的内存(私有(private)工作集)? 最佳答案 您在JConsole(或其他监控工具)中看到的是java内存的使用模式。JVM的内存通常在这些区域之间划分(您也可以在监控工具中看到)。用于Java对象的堆内存非堆内存是java存储加载类的地方元数据和JVM代码native内存是为dll和Java的native代码(非常低级)。有时你会得到一个OOM在这个
如何从Java程序中获取VM的最小和最大堆大小设置? 最佳答案 最大堆大小:Runtime.getRuntime().maxMemory();其他一些您可能会感兴趣的计算:Runtimeruntime=Runtime.getRuntime();longmaxMemory=runtime.maxMemory();longallocatedMemory=runtime.totalMemory();longfreeMemory=runtime.freeMemory();longtotalFreeMemory=freeMemory+(max
好的,我知道我应该对我的特定应用程序进行基准测试,等等,但是:-Xmx的默认JVM设置、默认垃圾收集器等,对于大多数典型的Java程序来说是合理的默认设置,并且可能不适合惯用的Scala代码(部分因为惯用的Scala会产生更多的“垃圾”)。所以我正在寻找可供选择的建议。典型的Scala程序是否需要更高的-Xmx设置?某些JVM是否比其他JVM更适合scala?与Java通常默认的相比,Scala的不同垃圾收集器(-XX:+UseParallelGCvsXX:+UseConcMarkSweepGC)通常是更安全/更好/更快的猜测/赌注/默认值吗?对于Scala代码,我还应该特别考虑其他选
是否可以在JVM内存之外创建一个持久内存对象,可以在JVM内部作为对象使用,以便在JVM重启后仍然存在?特别的想法是,我们可以在JVM之外分配内存,然后使用JNI接口(interface)来访问该内存并关联一些Java数组。有人尝试过这种黑客行为吗?任何平台依赖都足够了。例如,这有助于在JVM进程重新启动期间执行内存中DB加载的优化。 最佳答案 是的,这是完全可能的,即使没有JNI。这个想法是有一个MappedByteBuffer由tmpfs上的"file"支持文件系统。例如。在Linux上,您可以使用/dev/shm(或/run/
假设金钱不是一个限制因素,我想编写一个在一台强大的机器上运行的Java程序。我们的目标是让Java程序尽可能快地运行,而无需交换或转到磁盘。假设这台电脑有:1TBRAM(64个16GBDIMM)64个处理器内核(8个8核处理器)运行64位Ubuntu在JVM中运行的Java程序的单个实例能否利用这么多RAM和处理器?是否有任何实际考虑可能会限制使用和效率?操作系统进程(内存和线程)限制?JVM内存/堆限制?JVM线程限制?谢谢,盖伦 最佳答案 单个实例可以尝试访问所有内存,但是NUMA区域意味着诸如GC之类的事情在访问另一个区域中的
当jmap进行内存转储时,我的java应用程序是否继续运行? 最佳答案 我在尝试在生产机器上使用jmap创建hprof文件时遇到了问题,这需要很长时间,并且很自然地将javawebapp锁定了很长时间。我找到了这个页面:http://blogs.atlassian.com/2013/03/so-you-want-your-jvms-heap/其中解释了您还可以使用gdb(在linux系统上)转储java进程的核心。使用此核心文件,您可以生成hprof文件以在单独的进程中进行分析,从而防止您的java服务器进程被中断这么长时间。如果您
我正在对一个tomcat服务器进行负载测试。服务器有10G物理内存和2G交换空间。堆大小(xms和xmlx)之前设置为3G,服务器运行良好。由于我仍然看到剩余的可用内存很多且性能不佳,我将堆大小增加到7G并再次运行负载测试。这次我观察到物理内存很快被吃光了,系统开始消耗交换空间。后来tomcat用完swap空间就崩溃了。我在启动tomcat时包含了-XX:+HeapDumpOnOutOfMemoryError,但没有得到任何堆转储。当我检查/var/log/messages时,我看到kernel:Outofmemory:Killprocess2259(java)score634orve