据我所知,对于旧一代JVM中的空间,它可以用于两个目的,
我的问题是,
提前谢谢你,林
在@Lin Ma的评论中,将此代码用于回答问题:
class SomeClass{
private static List<Object> memoryLeakCulprit = new ArrayList<Object>();
void someMethod(Object obj){
//adding the reference of some object in the culprit list
memoryLeakCulprit.add(obj);
}
//supposed to remove the reference passed
void someOtherMethod(Object obj){
obj = null;
//bummer forgot to remove the reference from list
//now the instance is not reachable by obj
//so now as new references are added to culprit list the memory will keep on increasing in size
}
}
乌德帕特
如何解决这个漏洞
oid someOtherMethod(Object obj){
//before setting the obj reference to null it must be removed from culprit list
memoryLeakCulprit.remove(obj);
//now its safe to set this reference to null
obj = null;
}
解决泄漏的唯一方法是使用一些分析工具(如JProfiler、VisualVM)分析应用程序并找出导致泄漏的类。
当你找到这个类时,代码必须被修改,这是唯一的方法。
在程序退出之前不需要释放引用。原因是静态
变量(MemyLeakCulprit
)绑定到Class对象,一旦您退出程序,所有引用都会自动释放,包括Class Object。
另一方面,请务必在退出程序之前关闭系统资源(套接字、数据库连接)。
让我回答2。它绝对不是深度复制:GC将对象作为不同的内存块处理,深度复制实际上只意味着复制许多连接到对象图中的不同对象。此外,你最好想象一个动作,而不是复制;复制实际上只是一个“实现细节”,而预期的效果是重新定位。
我在docker中运行的应用程序面临问题。出乎意料的是,它在30分钟后坠毁。当我的应用程序处理哪个缓存时,首先怀疑的是内存利用率。 我在应用程序启动时运行该命令,它显示元空间利用率为98%,这很奇怪。 所以我的问题是,这种利用率是否表明我的应用程序将98%的操作系统内存用于JVM进程,或者98%的操作系统内存可用于JVM?
我正在为max分配8GB内存给Java编写的应用程序。它会内存溢出。我相信年轻一代总是比默认情况下的老一代小(堆的1/4)。而Eden/幸存者1,2在年轻一代内部。我相信在Eden空间中创建了新对象。 即使老一代还没有满,但年轻一代已经完全满了,java应用程序还是会耗尽内存吗? 如果短寿命的对象比长寿命的对象多,那么可以为年轻一代分配更多内存,或者至少将堆的50%分配给年轻一代吗?或者,由于jv
绝大部分 Java 程序员应该都见过 "java.lang.OutOfMemoryError: PermGen space "这个异常。这里的 “PermGen space”其实指的就是方法区。不过方法区和“PermGen space”又有着本质的区别。前者是 JVM 的规范,而后者则是 JVM 规范的一种实现,并且只有 HotSpot 才有 “PermGen space”,而对于其他类型的虚拟机
我预先承认,这个问题非常类似于:大量cms标记/备注暂停,即使旧版还没有满一半,并且无明显原因开始使用终身收藏。我发帖是因为1。这些线已经有1年多的历史了,还有2年。我希望学习如何找到这种行为的根本原因。 我们有一个OAS/OC4J(这不是我们的错!)运行在RHEL5/Redhat 5.11、Java 6上的全天候Java应用服务器。这在内存方面已经稳定了很多年,直到最近,由于频繁的CMS终身空间
我运行了两个用nginx群集的tomcat实例。在我的tomcats上,我将Infinispan作为分布式缓存运行。当我在缓存中插入大约4mio的记录时,有些奇怪的事情发生了。在图1中你可以看出我的意思。JVM分配的内存比以往任何时候都要多,而且使用后不会释放。 JVM参数: xmx8g xx:newRatio=4 xx:survivorratio=8 xx:+UseCompressedoops
我们使用G1收集器<当一个年轻的GC发生时(不是混合GC),堆的变化:[Eden:3666.0M(3666.0M)- 堆的变化为4819.1M(5346.0-526.9) 伊甸园改变了3666.0(3666.0-0.0)和幸存者-34M(20-54);为什么堆的变化不等于伊甸园和幸存者的总和(4819.1不等于(3666.0-34))?年轻的GC清除对象在老一代? gc日志: