Tag:

Java堆空间 – -Xmx如何正常工作?

我在我的应用程序中遇到了臭名昭着的OutOfMemoryException ,而不是简单地增加可用堆空间的数量,我试图查看问题所在,以防万一,我的应用程序出现了某种泄漏。 我添加了JVM参数-XX:+ HeapDumpOnOutOfMemoryError ,当遇到OutOfMemory错误时会创建堆转储。 然后我分析了使用不同的分析工具生成的转储文件。 然后我开始使用-Xmx参数并观察模式。 令我困惑的是以下内容。 为什么在分析转储时我发现所有对象的总大小远小于我使用-Xmx参数设置的总大小? 例如,假设我将-Xmx设置为’2048m’。 当我分析转储文件时,我在堆上发现了总共400Mb的对象。 我期待找到2GB。 我错过了什么吗?

为什么YARN java堆空间内存错误?

我想尝试在YARN中设置内存,所以我将尝试在yarn-site.xml和mapred-site.xml上配置一些参数。 顺便说一句,我使用hadoop 2.6.0。 但是,当我做mapreduce工作时,我收到一个错误。 它像这样说: 15/03/12 10:57:23 INFO mapreduce.Job: Task Id : attempt_1426132548565_0001_m_000002_0, Status : FAILED Error: Java heap space Container killed by the ApplicationMaster. Container killed on request. Exit code is 143 Container exited with a non-zero exit code 143 我认为我已经正确配置了,我给map.java.opts和reduce.java.opts小尺寸= 64 MB。 我尝试配置一些参数,比如在mapred-site.xml上更改map.java.opts和reduce.java.opts,我仍然会收到此错误。 我认为我并不真正理解YARN记忆是如何工作的。 顺便说一句,我尝试单节点计算机。

是否有工具来分析大型Java堆转储而不加载完整的hprof文件?

我使用Eclipse MAT来分析hprof文件。 这是非常好的但是如果你有2Gb堆转储,那么你需要运行具有2Gb +堆大小的MAT本身才能加载完整的堆转储。 我想知道是否有人知道一个工具可以分析2Gb hprof文件而不使用那么多的内存本身(例如它不加载完整的文件,但不知何故走过它)? 如果在客户服务器上生成hprof文件,这将非常有用,因为我可以在服务器上运行某些分析,而不是尝试通过VPN复制2Gb文件。

Java:在循环中实例化变量:好的还是坏的样式?

我有一个简单的问题。 通常我会编写如下代码: String myString = “hello”; for (int i=0, i<10; i++) { myString = "hello again"; } 因为我认为以下不是好的样式会导致它产生太多不必要的对象。 for (int i=0, i<10; i++) { String myString = "hello again"; } 这甚至是正确的吗? 或者就是这种情况,当我有一个显式对象,如我创建的类中的对象? 如果是boolean或int怎么办? 什么是更好的编码风格? 在循环之前将它实例化一次并在循环中使用它或者每次在循环中实例化它? 为什么? 因为程序更快或更少使用存储或…? 有人告诉我,如果它是一个布尔值,我应该直接在循环中实例化它。 他说这对堆没有影响,而且变量属于循环内部会更清楚。 那么什么是正确的? 谢谢你的回答! 🙂 ==== 谢谢你的所有答案! 总之:最好在尽可能小的范围内声明一个对象。 通过声明和实例化循环外的对象没有性能改进,即使在每个循环中对象都被重新实例化。

删除Java中的一部分数组以释放堆上的内存

我正在为Java中的背包问题实现动态编程算法。 我声明了数组,然后将其大小初始化为[对象数] [背包的容量]。 当我的对象数量或容量变得太大时,我会收到内存错误,因为堆上的空间不足。 我的问题是:如果我继续删除双数组中的行,Java会在删除时释放内存吗? 或者Java是否保留了我最初创建的数组大小的内存空间? 如果是后者,有没有办法在Java中手动释放内存? 谢谢你的帮助!

如何在没有引用的情况下访问Java堆对象?

我想获得对Java堆中所有对象的引用,即使我没有立即在活动线程中引用这些对象。 我不需要非引用的对象(那些“排队”用于垃圾收集),但是想要得到任何仍在使用的对象。 目标是序列化和存储所有对象,以实现穷人的执行状态持久性。 我意识到兔子洞在涉及不同类型的瞬态时会变深,但简单地持久化对象和加载的类定义对我来说会很有用。 有没有办法访问堆才能实现这一目标? 我是否会忽视更直接的方法?

Jmap堆转储,是否包括年轻一代?

快问 jmap堆转储是仅包含旧代,还是年轻代? 很长的解释 我有2个堆转储( jmap -heap:format=b 9999 ): 我的一台服务器没有加载(没有HTTP请求) 一个工作50%CPU,高负载(基准测试) 现在,第一个转储显示的堆大小比第二个大 (我认为这很奇怪)。 可能是因为Young Generation(高负载)经常变化,因为垃圾收集器经常运行(是的,JVM几乎已满)? 老一代人满99%,我注意到年轻一代的空间使用量差异很大。 因此,这意味着我在GC完成工作后立即进行了第二次转储,这就是为什么它的尺寸更小。 我对吗 ? 附加信息 : Java args: -XX:+UseParallelGC -XX:+AggressiveHeap -Xms2048m -Xmx4096m -XX:NewSize=64m -XX:PermSize=64m -XX:MaxPermSize=512m

Java在哪里做局部变量,对象引用,实例变量

我目前正在学习java,堆栈和堆的内存概念,我知道局部变量和方法调用都存在于一个叫做堆栈的地方。 和对象住在堆里面。 但是如果该局部变量包含一个对象呢? 或者有对象参考? public void Something(){ Duck d = new Duck(24); } 它仍然存在于堆栈中吗? 实例变量在哪里? 请尽量保持简单。 谢谢。

在JVM上禁用本地JMX连接

我们正在编写一个java程序,它将密码保存在内存中。 不幸的是,用户可以轻松地使用jconsole或jmap创建堆转储文件并打开它以查找密码。 我认为jconsole使用本地套接字连接jvm。 我想知道,有没有办法甚至为本地用户禁用jmx? 有没有办法完全禁用堆转储? 由于用户可以访问内存段,因此无论如何都可以访问密码。 但是,我想禁用标准的方法来使行动尽可能昂贵。

Mockito在一个简单的测试中抛出一个OutOfMemoryError

我尝试使用Mockito来模拟数据库池(仅用于检索数据),但是当运行在一段时间内检索到许多模拟连接的性能测试时,它会耗尽内存。 这是一个简化的自包含代码,它在我的机器上进行大约150,000次循环迭代后抛出OutOfMemoryError(尽管似乎没有任何东西可以全局保存,并且所有东西都应该是垃圾可收集的)。 我究竟做错了什么? import static org.mockito.Mockito.when; import java.sql.Connection; import org.mockito.Mock; import org.mockito.MockitoAnnotations; public class Test1 { static class DbPool { public Connection getConnection() {return null;} } @Mock private DbPool dbPool; @Mock private Connection connection; public Test1() { MockitoAnnotations.initMocks(this); when(dbPool.getConnection()).thenReturn(connection); for(int i=0;i<1000000;i++) { dbPool.getConnection(); System.out.println(i); } } public static void main(String s[]) { new Test1(); } […]