Tag: 内存管理

使用大量内存的Java应用程序。 使用-Xmx?

我有一个在16G的机器上使用大约15G的Java应用程序。 我不知道是否应该设置最大堆大小。 如果设置将jvm吃掉所有ram达到极限然后开始垃圾收集并停止一切,而它通过15G堆对象搅拌? 如果没有,jvm会因为没有使用机器上所有可用的ram而损害性能。 我的具体vm是:Java HotSpot(TM)64位服务器VM(版本1.6.0_03-b05,混合模式)。 谢谢

Hibernate:在存储其更改时evict()一个持久对象

我有一个持久的hibernate对象,我使用session.save(object) 我改变了。 我想执行session.evict(object)来保存内存,就像我完成了对象一样。 evict()的文档说明对象的更改不会被持久化。 换句话说 – 逐出将导致我失去对对象所做的更改。 我可以调用session.flush()但这会刷新所有更改。 如何在驱逐前坚持对单个持久对象所做的更改?

静态方法中的局部变量也是静态的吗?

我想知道如果我们在静态方法中声明它们,所有局部变量都会变为静态吗? 例如: public static void A(){ int x [] = {3,2}; changeX(x); for (int i = 0; i< x.length; i++){ System.out.println(x[i]); // this will print -1 and 1 } } private static void changeX(int[] x){ x[0] = -1; x[1] = 1; } 据我所知,Java总是按值传递,但为什么在我们进行changeX调用后X的状态发生了变化? 有人可以解释一下吗? 任何人都可以解释Java如何在内存分配方面处理静态变量? 如果我们将静态变量作为参数传递给函数会发生什么(我知道人们通常不这样做)

减少内存流失的方法

背景 我有一个Spring批处理程序,它读取一个文件(我正在使用的示例文件大小约为4 GB),对该文件进行少量处理,然后将其写入Oracle数据库。 我的程序使用1个线程来读取文件,使用12个工作线程来进行处理和数据库推送。 我正在搅拌很多很多年轻的生成记忆,这导致我的程序比我想象的要慢。 建立 JDK 1.6.18 Spring批次2.1.x 4核心机器16 GB内存 -Xmx12G -Xms12G -NewRatio=1 -XX:+UseParallelGC -XX:+UseParallelOldGC 问题 有了这些JVM参数,我可以为Tenured Generation提供大约5.x GB的内存,为Young Generation提供大约5.X GB的内存。 在处理这个文件的过程中,我的Tenured Generation很好。 它增长到最大可能3 GB,我从来不需要做一个完整的GC。 然而,年轻一代最多次击中它。 它达到5 GB范围,然后发生并行次要GC并将Young Gen清除至500MB。 Minor GCs比完整的GC更好,但是它仍然会减慢我的程序(我很确定当年轻的gen集合发生时应用程序仍然会冻结,因为我看到数据库活动已经消失)。 我花费超过5%的计划时间用于较小的GC,这似乎过多。 我会说在处理这个4 GB文件的过程中,我会通过50-60GB的年轻生成内存进行流失 。 我在程序中没有看到任何明显的缺陷。 我试图遵守一般的OO原则并编写干净的Java代码。 我试图不要无缘无故地创建对象。 我正在使用线程池,并且尽可能传递对象而不是创建新对象。 我将开始分析应用程序,但我想知道是否有人有一些良好的一般经验法则或反模式,以避免导致过多的内存流失 ? 50-60GB的内存流失是否可以处理4GB文件? 我是否必须恢复到像对象池这样的JDk 1.2技巧? (尽管Brian Goetz做了一个演示文稿,其中包括为什么对象池是愚蠢的,我们不再需要这样做。我相信他比我更信任自己.. :))

线程消耗的内存

我需要监视由我的应用程序生成的线程消耗的内存量。 如果贪婪的线程消耗太多内存,那么我们的想法是采取纠正措施。 我已经提到我的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 […]

对象池

维护经常使用的对象池并从池中抓取一个而不是创建新对象的专业人员和成员是什么? 类似于字符串实习的东西,除了它可以用于所有类对象。 例如,它可以被认为是好的,因为它节省了gc时间和对象创建时间。 另一方面,如果从多个线程使用它,它可能是同步瓶颈,需要显式释放并引入内存泄漏的可能性。 通过占用可回收的内存,它会给垃圾收集器带来额外的压力。

新的总是在C ++ / C#/ Java中分配在堆上

无论使用C ++或C#还是Java,我的理解始终是当我们使用new关键字创建对象时,它会在堆上分配内存。 我认为new的只需要引用类型(类),并且原始类型(int,bool,float等)从不使用new并且总是进入堆栈(除非它们是类的成员变量用new实例化)。 但是,我一直在阅读使我怀疑这个长期存在的假设的信息,至少对于Java和C#而言。 例如,我刚注意到在C#中, new运算符可用于初始化值类型,请参见此处 。 这是规则的例外,是该语言的辅助function,如果是,那么还会有哪些其他例外? 有人可以澄清一下吗?

如何避免回调中的内存泄漏?

有效的Java说: 内存泄漏的第三个常见来源是侦听器和其他回调。 如果您实现客户端注册回调但未明确注销回调的API,则除非您采取某些操作,否则它们将累积。 确保回调被及时垃圾回收的最佳方法是仅存储对它们的弱引用,例如,通过仅将它们存储为WeakHashMap中的键。 我是Java的初学者。 有人可以教我如何在回调中创建弱引用并告诉我它们如何解决内存泄漏问题? 谢谢。

Java中是否存在内存泄漏?

我多次问这个问题。 什么是回答的好方法

什么存储在堆上以及存储在堆栈中的内容?

任何人都可以用C,C ++和Java清楚地解释。 什么都在堆栈上,什么都在堆上,什么时候分配完成。 我所知道的, 每个函数调用的基元,指针或引用变量的所有局部变量都在新的堆栈帧上。 用new或malloc创建的任何东西都在堆上。 我很困惑一些事情。 作为在堆上创建的对象的成员的引用/原语是否也存储在堆上? 那些在每个帧中递归创建的方法的本地成员呢? 它们都在堆栈中,如果是,则在运行时分配堆栈内存吗? 对于文字,它们是代码段的一部分吗? 那么C中的全局变量,C ++ / Java中的static和C中的static。