Tag: 内存管理

Java的最大线程数非常有限?

我们有一个带512Mb内存的小文本框。 我们想在这个框中看到我们可以用Java创建多少个线程。 令我们惊讶的是,我们不能创造很多。 基本上,您可以使用-Xss设置的最小堆栈大小为64k。 简单的数学会告诉你64 * 7000将消耗430Mb所以我们只能将它达到大约7000个线程左右然后我们遇到了这个错误: java.lang.OutOfMemoryError: unable to create new native thread. 这是Java的真正限制吗? 每512Mb的ram我们只能挤7k左右的线程?

将变量推送到堆栈中的Stack和Variables差异?

所以我知道存在2个内存区域: Stack和Heap 。 我也知道,如果你创建一个局部变量,它将存在于堆栈中,而不是堆中。 随着我们将数据推入其中,堆栈将会增长,如: 现在我将尝试通过我对你的困惑: 例如,这个简单的Java代码: public class TestClass { public static void main(String[] args) { Object foo = null; Object bar = null; } } 被翻译成这个字节码: public static void main(java.lang.String[]); Code: Stack=1, Locals=3, Args_size=1 0: aconst_null 1: astore_1 2: aconst_null 3: astore_2 4: return LineNumberTable: line 5: 0 line 6: 2 line 7: […]

Java:为什么它使用固定数量的内存? 或者它如何管理记忆?

似乎JVM使用了一些固定数量的内存。 至少我经常看到参数-Xmx (对于最大尺寸)和-Xms (对于初始尺寸),这表明了这一点。 我觉得Java应用程序不能很好地处理内存。 我注意到的一些事情: 甚至一些非常小的示例演示应用程序也会加载大量内存。 也许这是因为加载了Java库。 但为什么需要为每个Java实例加载库? (这似乎是因为多个小应用程序线性地占用更多内存。请参阅此处了解我描述此问题的一些细节。)或者为什么这样做? 像Eclipse这样的大型Java应用程序经常会因一些OutOfMemoryexception而崩溃。 这总是很奇怪,因为我的系统上仍然有足够的内存。 通常,它们会在运行时消耗越来越多的内存。 我不确定他们是否有一些内存泄漏,或者这是因为内存池中的碎片 – 我觉得后者就是这种情况。 例如,Java库似乎需要比类似强大的库(如Qt)更多的内存。 为什么是这样? (比较,启动一些Qt应用程序并查看它们的内存使用情况并启动一些Java应用程序。) 为什么它不使用像malloc和free这样的底层系统技术? 或者如果他们不喜欢libc实现,他们可以使用jemalloc (就像在FreeBSD和Firefox中一样 ),这看起来非常好。 我很确定这会比JVM内存池表现更好。 而且不仅表现更好,还需要更少的内存,尤其是 适用于小型应用。 另外:有人已经尝试过吗? 我会对基于LLVM的Java JIT编译器感兴趣,它只使用malloc / free进行内存处理。 或者这也可能与JVM实现到实现有所不同? 我主要使用Sun JVM。 (另请注意:我不是直接在这里谈论GC。GC只负责计算可以删除的对象和初始化内存释放,但实际的释放是一个不同的子系统.Afaik,它是一些自己的内存池实施,而不仅仅是free电话。) 编辑:一个非常相关的问题: 为什么(Sun)JVM对内存使用有固定的上限? 或者换句话说:为什么JVM处理内存分配的方式与本机应用程序不同?

用于内存减少的Java整数标志和按位运算

使用整数标志和按位运算是减少高容量对象的内存占用的有效方法吗? 记忆足迹 我的理解是,通常将boolean存储为JVM实现中的int 。 它是否正确? 在这种情况下,32个标志肯定代表了大量的内存占用减少。 虽然JVM实现当然有所不同,但情况可能并非总是如此。 性能 我的理解是,CPU是非常数字驱动的,并且按位操作与计算中的内容一样高效。 在布尔运算中使用按位运算会有性能损失 – 甚至增益吗? 备择方案 有没有更好的方法来完成同样的事情? Enum是否允许组合标志,即FLAGX = FLAG1 | FLAG2 FLAGX = FLAG1 | FLAG2 ? 示例代码 注意最后一个方法propogateMove()是递归的,可能每秒被调用数百次,并且直接影响我们应用程序的响应性,因此使用标志来避免逻辑位并调用其他方法。 // FLAGS helper functions private final void setclear(int mask, boolean set) { if (set) set(mask); else clear(mask); } private final void set(int mask) { flags |= mask; } […]

如何缩小java堆空间?

我有一个Java控制台应用程序,它使用DOM处理大型xml文件。 基本上它从数据库中获取的数据创建xml文件。 现在,正如你猜测它正在使用大量内存,但令我惊讶的是,它与糟糕的代码无关,而是与“java堆空间不缩小”有关。 我尝试使用这些JVM参数从Eclipse运行我的应用程序: -Xmx700m -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 我甚至加了 -XX:-UseSerialGC 因为我发现并行GC忽略“MinHeap”和“MaxHeap”选项。 即使有所有这些选项我的应用程序的内存使用图形看起来像这样: 正如您所看到的,我的应用程序在某一时刻需要大约400 MB的堆空间,堆增长到大约650 MB,但几秒钟之后(当xml生成完成时)我的应用程序下降到12MB的已用堆,但是“堆大小” “保持在650 MB左右。 我的RAM需要650 MB! 这是古怪的,你不觉得吗? **有没有办法强制JVS缩小可用堆大小,比如当前使用堆的150%?**就像,如果我的应用程序需要15 MB内存,堆大小约为20MB,当我的应用程序要求400 MB时在我的应用程序完成繁重的操作后,ram,堆增长到~600 MB并且DROPS回到~20 MB?

Eclipse Indigo在OS X Lion上打字滞后

我正在做一个相当大的项目,并且最近碰到了90年代我的老朋友, 打字滞后 。 我的设置是带有SSD驱动器的MacBook Pro 2.2 GHz i7 8GB,到目前为止还没有出现任何严重的性能问题。 我已将内存分配增加到-Xmx1024m和XX:MaxPermSize=512m 。 没有大量使用插件。 此外,这只发生在默认编辑器中的.java文件上。 可能是什么问题呢? 编辑: 我发现了问题。 我注意到只有在编辑大型java文件时才会出现问题。 在我的情况下,该类有1800行。 这很奇怪,因为我在Ubuntu上没有遇到同样的eclipse设置问题。 似乎Mac上的Eclipse无法处理我正在编辑的大文件。 有什么建议么? EDIT2: 我正在使用Eclipse Indigo for Java EE和最新更新(3.7.1.X) 已安装的插件: m2eclipse的 MercurialEclipse又称HGE(来自官方eclipse更新站点的 1.9.1) Subclipse(已安装,但未在发生键入延迟的工作空间中使用) ADT (已安装但未在此项目中使用) 除非另有说明,否则所有插件均通过Eclipse市场安装并更新到最新版本。

Java非堆内存和堆栈内存有什么区别? 它们是相同的,如果不是它们之间有什么区别?

我正在使用Jconsole来监视Java应用程序。 内存选项卡显示不同的堆和非堆内存 堆内存使用情况 非堆内存使用情况 记忆池“CMS Old Gen” 记忆池“Par Eden Space” 记忆池“Par Survivor Space” 内存池“代码缓存” 内存池“CMS Perm Gen” 这些术语有什么区别。 另请提供一些信息 – 如何通过监视这些参数来查找应用程序行为中的exception。

在Java中突发内存使用

我试图在Java中处理正确的内存使用和垃圾收集。 无论如何我都不是新手程序员,但在我看来,一旦Java接触到某些内存,它就永远不会被其他应用程序使用。 在这种情况下,您必须确保峰值内存永远不会太高,或者您的应用程序将持续使用峰值内存使用量。 我写了一个小样本程序试图certificate这一点。 它基本上有4个按钮…… 填充类范围变量BigList = new ArrayList()包含大约25,000,000个长字符串项。 调用BigList.clear() 重新BigList = new ArrayList()列表 – BigList = new ArrayList()再次(缩小列表大小) 对System.gc()调用 – 是的,我知道这并不意味着GC会真正运行,但这就是我们所拥有的。 接下来,我在Windows,Linux和Mac OS上进行了一些测试,同时使用默认任务监视器来检查进程报告的内存使用情况。 这是我发现的…… Windows – 抽取列表,调用clear,然后多次调用GC不会减少内存使用量。 但是,使用new重新分配列表然后多次调用GC会将内存使用量减少回初始级别。 IMO,这是可以接受的。 Linux (我使用Mint 11发行版与Sun JVM) – 与Windows相同的结果。 Mac OS – 我遵循了与上面相同的步骤,但即使重新初始化列表调用GC似乎也没有效果。 该程序将使用数百MB的RAM,即使我没有内存。 任何人都可以向我解释这个吗? 有些人告诉我一些关于“堆”记忆的东西,但我仍然不完全理解它,我不确定它是否适用于此。 据我所知,我不应该看到我在Windows和Linux上的行为。 这只是Mac OS的活动监视器测量内存使用情况的方式还是有其他不同之处? 我宁愿没有我的程序闲置大量的RAM使用。 感谢您的见解。

解释jstat结果

我是jstat工具的新手。 因此我做了如下的样本。 ./jstat -gcutil -t 4001 5000 Timestamp S0 S1 EOP YGC YGCT FGC FGCT GCT 565088.4 0.00 0.89 75.86 40.59 84.80 405 3.822 4 0.549 4.371 565093.4 0.00 0.89 77.81 40.59 84.80 405 3.822 4 0.549 4.371 565098.4 0.00 0.89 77.81 40.59 84.80 405 3.822 4 0.549 4.371 565103.5 0.00 0.89 77.85 40.59 84.80 […]

如何限制Java 8应用程序消耗的总内存?

为了限制Java 7应用程序消耗的总内存,我可以使用以下公式(取自本文 ): 最大内存= [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss] 删除PermGen后,此公式如何针对Java 8应用程序进行更改? 我应该使用选项“-XX:MaxMetaspaceSize”来限制元空间消耗的最大内存吗?