Tag: 内存

JDBC4Connection中的内存泄漏

我试图在我们的一个Java守护进程中捕获内存泄漏,在转储内存并通过Memory Analyzer Tool进行分析之后,注意到大部分泄漏是由JDBC4Connection引起的: 10 instances of “com.mysql.jdbc.JDBC4Connection”, loaded by “sun.misc.Launcher$AppClassLoader @ 0x2aaab620ed00” occupy 858,283,752 (81.55%) bytes. Biggest instances: * com.mysql.jdbc.JDBC4Connection @ 0x2aaab64ad820 – 87,110,160 (8.28%) bytes. * com.mysql.jdbc.JDBC4Connection @ 0x2aaab64af520 – 86,730,408 (8.24%) bytes. * com.mysql.jdbc.JDBC4Connection @ 0x2aaab64ad0e0 – 86,584,048 (8.23%) bytes. * com.mysql.jdbc.JDBC4Connection @ 0x2aaab64aede0 – 86,488,800 (8.22%) bytes. * com.mysql.jdbc.JDBC4Connection @ 0x2aaab61f5320 – […]

JVisualVM / JConsole中的System.gc()vs GC按钮

我目前正在测试我的概念certificate原型处理XML模式,并围绕一个非常耗费内存的外部库构建树自动机(我已经获得了源代码),我想绘制“真正的峰值”(堆) )随着模式大小的增加,不同运行的内存消耗(使用的度量标准适合我的purpouse并且不影响问题),或者至少是它的合理近似值。 为了给出一个数量级,对于一个真正的峰值为100MB的运行(我测试它运行几次完全相同的输入/参数配置,强制jvm内存-Xmx和-Xms减少值,我得到Exception in线程“main”java.lang.OutOfMemoryError:GC开销限制超过 <100MB,具有稳定且可重复的结果)它占用大约1.1GB,这就是为什么获取实数非常重要,因为它们差别很大! 我花了最近10天在网上和stackoverflow中阅读问题,我实际知道的是: System.gc()“建议”GC运行,不以任何方式强制它,因此不可能依赖它来检测内存使用峰值 通常建议的是计算对象占用(我看到了SizeOf项目,我尝试并且工作正常,即使它不符合我的需要),这对我来说是不可行的,因为由于创建了大量的内存分配很多收集(设置,列表和映射)迭代器在不同的方法中,被称为非常多次(对于我记忆中的10分钟,每个数百万次),因此检测所有涉及的对象将非常困难并执行总和(我用内存消耗图调试了很多次运行而不能只识别一个瓶颈) 没有办法轻易获得方法的内存占用(表示为对象内存分配的峰值) 事实上,我自己经历过System.gc()调用不可靠(例如,由于GC真的被调用而在System.gc()之后读取不同的内存),但是当我按下JVisualVM或Jconsole中的“GC按钮”它永远不会运行GC或拒绝这样做。 所以我的问题是:调用它们的按钮实现(我还没有尝试过,但是对于我现在所读到的,使用带有attach api的 jconsole.jar似乎是可行的)将不同于直接调用System.gc()从我的代码,从而解决我的问题? 如果没有,你如何解释该按钮的“确定性行为”? 到目前为止,我对10个增加的模式大小进行了实际内存峰值的手动测试(对于这种测量,模式是从单个“复杂度参数”自动生成的)并且我绘制了预期曲线,如果我将无法获得一个更好的解决方案我想将我的代码作为外部jar运行,其中-Xmx / -Xms等于略低于我对预期内存峰值的预测,捕获外部进程ErrorStream中的OutMemoryException并重新启动增加的内存直到完成运行已完成。 (如果天真的记忆预测不够健壮,我将应用适当的机器学习技术)。 我知道这不是一个优雅的解决方案,但在我的情况下(学术界)我可以花费一些额外的时间来进行这些测量。 如果您对此powershell方法有其他建议或改进,欢迎(非常)欢迎您分享。 系统信息(机器是Fedora 17,64位): java版“1.7.0_04”Java(TM)SE运行时环境(版本1.7.0_04-b20)Java HotSpot(TM)64位服务器VM(版本23.0-b21,混合模式) 在此先感谢,亚历山德罗

在内存jar /类文件中执行

我在某个位置有一个jar文件(例如app.jar),可以作为来自http服务器的文件/流。 问题是app.jar本身是一个经常更新的jar文件,在服务器上定期更新。 我有另一个jar文件(比如load.jar),任何用户都可以下载。 在运行时,用户运行load.jar,这需要在单独的进程中加载​​app.jar,将app.jar保存在内存中(不缓存到磁盘),然后执行app.jar并终止自身(加载。jar)。 有可能吗? 任何帮助都非常感谢。 提前致谢。 此致,KT —————————更新。 嗨, 谢谢大家的回复。 但是,我想我还没有给出完整的图片。 附上描绘场景的图像链接文本 。 4个jar子(实际的通用执行器)托管在中央服务器上。 这些经常更新(最初每天最多3-4次,最终每天一次)。 托管其中一个成员的本地服务器,该服务器已初始化。 本地服务器上的启动程序会下载所有4个二进制文件并将其保留在内存中 – 不会缓存到磁盘。 这些jar文件是自给自足的,并且不依赖于“本地服务器”上的任何库 – 它们实际上是从“本地服务器”调用jar。 “客户端”jar最终由“本地服务器”托管,并通过“本地服务器”通过webapp按需转发给其客户端。 此外,Launcher需要通过在单独的JVM中从服务器调用下载的Main jar来退出。 此致,KT

我可以在java中连续分配对象吗?

假设我有一大堆相对较小的对象,我需要经常迭代。 我想通过提高缓存性能来优化我的迭代,所以我想在内存上连续分配对象 [而不是引用],这样我就可以减少缓存丢失,整体性能可以更好。 在C ++中,我可以只分配一个对象数组,它会按照我的意愿分配它们,但是在java中 – 在分配数组时,我只分配引用,并且一次只分配一个对象。 我知道如果我“一次”分配对象[一个接一个],jvm 最有可能将对象分配为尽可能连续,但如果内存碎片化则可能还不够。 我的问题: 有没有办法告诉jvm在我开始分配对象之前对内存进行碎片整理? 是否足以确保[尽可能]连续分配对象? 这个问题有不同的解决方案吗?

具有数千个线程的内存设置

我正在Linux机箱(AMD 6 Core,16 GB RAM)上使用JVM(Oracle 1.7 64位)来查看应用程序中的线程数如何影响性能。 我希望测量上下文切换会降低性能。 我创建了一个创建线程执行池的小应用程序: Executors.newFixedThreadPool(numThreads) 我每次运行程序时都会调整numThreads ,以查看它的效果。 然后我将numThread作业( java.util.concurrent.Callable实例)提交到池中。 每一个都递增一个AtomicInteger ,做一些工作(创建一个随机整数数组并将其洗牌),然后睡一会儿。 想法是模拟Web服务调用。 最后,作业重新提交到池中,这样我总是可以使用numThreads作业。 我正在测量吞吐量,就像每分钟处理的作业数一样。 有几千个线程,我每分钟可以处理多达400,000个工作。 超过8000个线程,结果开始变化很大,这表明上下文切换正成为一个问题。 但是我可以继续将线程数增加到30,000,并且仍然可以获得更高的吞吐量(每分钟420,000到570,000个作业)。 现在的问题是:我得到了一个java.lang.OutOfMemoryError: Unable to create new native thread超过31,000个作业的java.lang.OutOfMemoryError: Unable to create new native thread 。 我试过设置-Xmx6000M这没有帮助。 我试过用-Xss玩,但这也无济于事。 我已经读过ulimit可能有用,但是增加ulimit -u 64000并没有改变任何东西。 有关信息: [root@apollo ant]# ulimit -a core file size (blocks, -c) 0 data seg size […]

标记要在GC中删除的对象

有没有我可以在java中标记一个对象,以便在下次清理时进行垃圾回收? 我听说将对象设置为null不再有效。

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

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

内存中引用变量和对象的逻辑结构/细节?

假设我们有一个class级: class Class1 { int i = 1; } 我们有一个变量: Class1 ob1 = new Class1(); 存储在变量ob1的引用本身是否存储它引用Class1对象的信息? 存储Class1的堆的部分是否存储了Class1类型的信息? 逻辑上看起来如何看待这些信息? 它是一个像application1.Class1这样的字符串或对某些引用类型池的引用? 如果您可以推荐这些信息的来源,我将非常感谢提供它,我在参考书中找不到它。

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 – 垃圾收集器如何快速知道哪些对象不再引用它们?

我知道在Java中,如果一个对象不再有任何引用,垃圾收集器会在一段时间后回收它。 但是垃圾收集器如何知道某个对象是否有与之关联的引用? 垃圾收集器是使用某种hashmap还是表? 编辑: 请注意,我不是在问gc的工作原理。 真的,我不是那么想的。 我特别要求gc知道哪些对象是活的,哪些是死的,效率很高。 这就是为什么我在我的问题中说gc维护某种hashmap或set,并且不断更新对象的引用数量?