Tag: 内存泄漏

JavaFX无限时间轴中的内存泄漏

我正在使用JavaFX设计秒表。 代码运行良好。 除了巨大的累积内存泄漏随着时间的推移。 每当我增加Timeline的framerate时,泄漏就会增加。 我目前使用的是4GB内存的Ubuntu 16.04,泄漏速度为300MB / min,速度为30fps。 那是5MBps。 我可以理解,这可能是由于重复绘制Scene而发生的,但为什么会累积? JVM不应该照顾这个吗? Main.java: package UI; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ButtonBar; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception{ primaryStage.setTitle(“StopWatch”); primaryStage.setScene(new Scene(getPane(), 400, 400)); primaryStage.show(); } private BorderPane getPane(){ BorderPane pane = new BorderPane(); ClockUI […]

ByteBuffer.wrap(byte )是否会导致长时间运行的应用程序出现内存泄漏?

我试图在线搜索,但没有找到答案。 基于java doc ,ByteBuffer.wrap()在每次调用中创建一个新的ByteBuffer。 在长时间运行的应用程序中,如果未触发gc,但应用程序一直在调用ByteBuffer.wrap(),则应用程序可能会在Java堆外部使用更多内存,并导致潜在的内存泄漏。 是对的吗? public static ByteBuffer wrap(byte[] array) Wraps a byte array into a buffer. The new buffer will be backed by the given byte array; that is, modifications to the buffer will cause the array to be modified and vice versa. The new buffer’s capacity and limit will be array.length, its […]

代码中的Android Memoryleak

我试图理解内存泄漏的概念。 我尝试了这个代码并尝试了一些我从相关post中找到的方法,但我无法解决问题。 需要帮助来了解此代码中发生内存泄漏的位置。 我的申请只有2项活动 //第一活动 package com.pace.mat; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.Window; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; public class MATDemoActivity extends Activity implements OnClickListener { private Dialog dialog1; private Button btnSubmit; private Context myClassContext; private ImageView RedImage,BlueImage,Yellow,Orange,Green; /** Called when the activity is first created. […]

Android内部类内存泄漏和上下文泄漏?

我在启动画面中使用Handler将重定向延迟到下一个活动,如下所示。 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.entrance); screenTimeOut(); } private void screenTimeOut() { /* New Handler to start the next screen * and close this Entrance after some seconds.*/ new Handler().postDelayed(new Runnable() { @Override public void run() { initTracker(); /* Create an Intent that will start the Next-Activity. */ checkLoginStatus(); } }, SPLASH_DISPLAY_LENGTH); […]

记录线程内存泄漏

我为我的程序编写了一个后台日志记录线程,如果一个类需要一个记录器,它会从我的线程池中提取它,所以对于每个文件名,只有一个日志在运行。 该类添加了需要通过log(String)记录的任何内容。 无论如何,每当我设置登录并且它运行writetolog()一段时间后我得到heapoutofmemoryexception。 这是由日志线程引起的,但是我无法看到内存泄漏的位置,而且我在线程方面也不是很好。 我唯一的想法是,它是在缓冲的作家? import java.io.File; import java.io.IOException; import java.io.FileWriter; import java.util.Calendar; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class Log extends Thread{ private String file; private BlockingQueue pq = new LinkedBlockingQueue(); private BufferedWriter bw; private boolean Writing; @Depreciated public Log(){ super(); file = “log.txt”; start(); } public Log(ThreadGroup tg, String fileName){ super(tg,fileName); file = fileName; […]

年轻的GC导致Metaspace增加,而不是Old Gen

从JDK7迁移到JDK 8时,我开始看到频繁的Full GC(具有更高的GC延迟)。 在分析了gc之后,发现在年轻的GC之后,元空间的使用增加了,而旧的使用率仍然相同。 我已将最大元空间大小(等于JDK7中的Perm Gen)设置为256MB。 当使用率达到210 MB左右时,将触发完整的GC。 我已经尝试将元空间最大大小设置为512MB,然后我也看到Metaspace Threshold导致Full GC。 为什么Young GC会导致元空间大小增长? JDK8引发了GC延迟。 使用JDK7,GC延迟通常低于100毫秒,而使用JDK8的全GC启动时间为800-1000毫秒。 这会影响我的应用程序性能。 我正在使用并行GC算法。 我怀疑在metaspace上的GC比Old gen GC要耗费更多时间。 有关为JDK8调优JVM的任何建议都将非常有用。 年轻的GC: S0 S1 EOM CCS YGC GCT FGC FGCT GCT LGCC GCC 0.00 40.28 99.78 21.95 56.28 – 149 6.647 2 3.276 9.924 Allocation Failure No GC 54.17 0.00 0.66 21.95 57.63 – 150 […]

简单类 – 它是一个内存泄漏?

我有一个非常简单的类,它有一个整数变量。 我只是将变量’i’的值打印到屏幕上并递增它,并使线程hibernate1秒钟。 当我针对此方法运行探查器时,即使我没有创建任何新变量,内存使用量也会缓慢增加。 执行此代码大约16个小时后,我发现内存使用量已增加到4 MB(当我启动程序时,最初为1 MB)。 我是Java的新手。 有没有人可以帮助解释我哪里出错了,或者为什么即使没有创建新变量,内存使用量也会逐渐增加? 提前致谢。 我正在使用netbeans 7.1及其分析器来查看内存使用情况。 public static void main(String[] args) { try { int i = 1; while(true) { System.out.println(i); i++; Thread.sleep(1000); } } catch(InterruptedException ex) { System.out.print(ex.toString()); } } 程序启动时的初始内存使用情况:1569852字节。 执行循环16小时后的内存使用情况:4095829字节

分析Java堆转储时耗尽内存

我有一个奇怪的问题,我需要分析一个1.5GB大小的Java堆转储(来自IBM JRE),问题是在分析转储时(我已经尝试过HeapAnalyzer和IBM Memory Analyzer 0.5 )这些工具耗尽内存我无法真正分析转储。 我的机器里有3GB的RAM,但似乎还不足以分析1.5 GB的转储, 我的问题是,您是否知道我可以使用我拥有的内存量运行的堆转储分析(支持IBM JRE转储)的特定工具? 谢谢。

JVM超出了使用-Xmx定义的最大内存

我们有一个Java Web应用程序,我们从Java 1.5.0.19升级到Java 1.6.0.21 /usr/java/jdk1.6.0_21/bin/java -server -Xms2000m -Xmx3000m -XX:MaxPermSize=256m -Djava.awt.headless=true -Dwg.environment=production -Djava.io.tmpdir=/var/cache/jetty -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=31377 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/webapp -Dprogram.name=run.sh -Djava.endorsed.dirs=/opt/3p/jboss/lib/endorsed -classpath /opt/3p/jboss/bin/run.jar:/usr/java/jdk1.6.0_21/lib/tools.jar org.jboss.Main -c default 正如你所看到的,它应该预先分配2GB的堆,并且最大值为3GB(为什么我们预先分配这么多是因为这个应用程序很古老而且设计很差,所以有很多东西需要加载)。 我们在升级到1.6后最近看到的问题是,有时候内存会进入屋顶。 虽然内存使用可能是一个应用程序问题,但JVM超过了堆的3GB最大设置。 使用top我看到: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 8449 apache 18 0 19.6g 6.9g 5648 S 4.0 84.8 80:42.27 java 那么具有3GB堆,256MB permgen甚至一些开销的JVM怎么能消耗6.9GB? […]

当并非所有使用的堆都可以从线程访问时查找Java内存泄漏

我正在研究一个基于Java的大系统中潜在的内存泄漏(或至少是内存浪费)。 JVM的最大堆大小为5 GB,并且2-3GB堆使用量是应用程序的预期基线。 (可能有更高的峰值) 在我正在调查的重载场景中,堆被填满了。 使用“Eclipse MemoryAnalyzer Tool”分析堆转储显示(毫不奇怪)堆已完全用完。 MAT显示了2个潜在的泄漏候选者,两者大致保留了2.5GB:java.lang.Thread和来自系统的域对象,该对象在系统中的事务处理期间广泛使用。 但是,从Thread实例可以访问所有这些域对象(不足为奇)。 毕竟,这些线程正在处理事务。 因此,归因于java.lang.Thread的2.5 GB几乎完全是由那些域对象引起的。 这里不足为奇。 列出所有java.lang.Thread实例的对象树并总结所有线程的保留堆会导致2.5 GB的保留堆。 如果无法从java.lang.Thread的实例访问堆,那么我应该在哪里寻找填充堆所需的其他2.5 GB? – 终结器队列中没有任何内容 – 没有大量未到达的对象待处理GC 我认为另一种提出这个问题的方法是:“如何找到所有从java.lang.Thread实例无法访问的对象?可能是OQL查询?”,另一个问题是:“那里有什么样的对象无法从java.lang.Thread的实例到达终结器队列中的对象和待处理GC的未引用对象吗?“