我一直试图在我的应用程序中找到内存泄漏一周,但没有任何成功.我尝试进行堆转储并使用jhat查看转储并追踪内存泄漏.
这是最好的方法吗?什么是使用堆转储追踪内存泄漏的最佳方法.
感谢您的帮助.
使用的VM: java版"1.6.0_25"Java(TM)SE运行时环境(版本1.6.0_25-b06)Java HotSpot(TM)64位服务器VM(版本20.0-b11,混合模式)
JVM选项: -Xmx1600m -XX:+ UseParallelGC -XX:MaxPermSize = 256m -Xms1600m -XX:+ HeapDumpOnOutOfMemoryError -XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps -verbose:gc -Xloggc:/tmp/gc.log
OOME Stack trace:无法得到这个.内核因内存不足错误而终止进程.
GC日志:最后几行
48587.245: [GC [PSYoungGen: 407168K->37504K(476160K)] 506729K->137065K(1568448K), 3.0673560 secs] [Times: user=3.53 sys=0.00, real=3.07 secs]
50318.617: [GC [PSYoungGen: 444224K->37536K(476416K)] 543785K->175177K(1568704K), 3.6635990 secs] [Times: user=3.70 sys=0.00, real=3.67 secs]
50453.841: [GC [PSYoungGen: 70092K->2912K(476672K)] 207734K->178513K(1568960K), 1.0164250 secs] [Times: user=1.29 sys=0.00, real=1.02 secs]
50454.858: [Full GC (System) [PSYoungGen: 2912K->0K(476672K)] [PSOldGen: 175601K->137776K(1092288K)] 178513K->137776K(1568960K) [PSPermGen: 60627K->60627K(74368K)], 2.0082140 secs] [Times: user=2.09 sys=0.00, …Run Code Online (Sandbox Code Playgroud) 我正在尝试继承,出于教育目的,我想检查为各种对象和对象中的字段分配的地址.有没有一个工具可以让我看到JVM正在使用的内存以及使用它的内容.
例如,如果我有两个类:
class A { int i,j; int f { ...} }
class B extends A { int c; /* more methods, overriding f and declaring new ones as well */ }
Run Code Online (Sandbox Code Playgroud)
并在对象a和实例中实例化这些类b.
是否有一个工具可用于分析内存使用情况并确切地查看为这些内存分配的内存?
谢谢!
我有3045的表格!组件(1015个标签,1015个文本字段,1015个组合框).所有这些都在JPanel和JScrollPane中的JPanel中.问题是滚动是"滞后".我的PC上有4GB RAM,所以我不认为这是问题所在.怎么了?在我的任务管理器中,应用程序使用~100mb.
我的代码:
final JScrollPane scrollPane_1 = new JScrollPane();
final JPanel panel = new JPanel();
panel.setLayout(null);
scrollPane_1.setViewportView(panel);
int y =0;
for(int i=0; i<1015;i++)
{
JLabel length = new JLabel();
length.setBounds(10, y, 350, 20);
length.setFont(new Font("Tahoma", Font.BOLD, 11));
length.setEnabled(false);
panel.add(length);
panel.revalidate();
JComboBox combo = new JComboBox();
combo.setModel(new DefaultComboBoxModel(new String[] {"=", "!="}));
combo.setBounds(10, y + 20, 70, 20);
panel.add(combo);
panel.revalidate();
JTextField text = new JTextField();
text.setBounds(10 + 80, y + 20, 200, 20);
panel.add(text);
panel.revalidate();
}
Run Code Online (Sandbox Code Playgroud)
编辑:我做了很多测试,我意识到只有当我使用组合框时才存在延迟,如果我使用例如文本字段而不是组合框,滚动是正常的...
在查看时Pagination,出现了渲染复杂页面的问题。API示例等。,通常指定pageFactory每次调用时简单构造一个新控件的 a。事实上,在分页时对下面的示例进行分析显示内存压力最小,并且迅速收集了一系列新实例。如果日益复杂的情况改变了情况,我该怎么办?
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Pagination;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
/** @see /sf/ask/5345178331/ */
public class PaginationSample extends Application {
private static final int N = 100;
private record Item(String name, Color color) {
private static final Random r = new Random();
public static Item ofRandom() …Run Code Online (Sandbox Code Playgroud) 我的问题是我不明白它是如何swingworker工作的,因为我想要做的是fa=worker.get()因为我有一个很长的方法来计算在后台运行的很多点因为我不想冻结我的界面而且我想要得到她的结果来绘制组件图像.但是当我这样做时,我不明白它的位置,fa=worker.get()因为我的控制台打印"titi"并且我进行了大量其他打印以查看到达的程序的下一部分,但没有人打印.请帮助我知道编译在get()执行它之后的位置,以及如果你知道如何实现我需要的每个代码块都是受欢迎的.
public void paintComponent(final Graphics g1){
// TODO Auto-generated method stub
final int width=getWidth();
final int height=getHeight();
image= new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//On transforme le rectangle de base en un rectangle qui a le meme ratio que le cadre contenant l'ancien
//(Il yaura dessus la meme fractale mais avec plus de fond noir) afin que l'on puisse zoomer sans deformer la fractale
frame = frame.expandToAspectRatio((double)getWidth()/getHeight());
FlameAccumulator fa=null;
worker= new SwingWorker<FlameAccumulator,FlameAccumulator>(){
@Override
protected …Run Code Online (Sandbox Code Playgroud) 我需要制作烛台图表,图表,xyplot(可能都在不同的应用程序中)
我已经尝试了jfreechart和javafx图表并且成功实现了两者.
由于这些图表来自交易视角,因此它们本质上是动态的.
我比jfreechart更喜欢javafx ....
但我想要具体的理由为什么我应该选择javafx而不是jfreechart.
有人做过任何研究吗?
我的应用程序需要动态绘制一些(最大)100点.
谢谢
我有一个非常长的字符串,我从书中得到.我使用setText()方法在JTextArea中显示它.它冻结了UI并花费了大量时间.我该如何解决这个问题?
这是SSCCE:
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
public class SSCCE extends JFrame {
JTextArea textArea;
public SSCCE() {
String text = buildLongString(400000);
textArea = new JTextArea();
textArea.setText(text);
textArea.setLineWrap(true);
add(new JScrollPane(textArea));
setSize(400, 350);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
private String buildLongString(int length) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < length; i++) {
builder.append("x");
}
return builder.toString();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new SSCCE(); …Run Code Online (Sandbox Code Playgroud) 在java swing tablemodel中,我们可以触发表更改,添加,删除等.我想知道如果组件不可见,这些方法调用是否很昂贵?
例如,另一个窗口覆盖它.或者它处于非活动选项卡中.
我正在尝试使用 using 创建一些数据的缩略图图表JScrollPane,但遇到性能困难。此示例有大约 100 个缩略图,每个缩略图有 5000 个样本。当我尝试向下滚动并返回向上多次时,滚动会出现延迟,CPU 负载增加,应用程序内存使用量达到超过 500 Mb。
有没有办法在不减少数据的情况下避免此性能问题?
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.ThermometerPlot;
import org.jfree.data.general.DefaultValueDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
public class ThumbnailChartsTest extends JPanel {
private static final int W = 200;
private static final int H = W;
private static final int N = 5000;
private static final Random random = new Random();
private static …Run Code Online (Sandbox Code Playgroud) 我有一个需要打开多个JFrame的应用程序(它是一个日志查看器,有时您需要在单独的窗口中查看一堆日志来进行比较).
似乎JVM(OS X上的Java 8更新101)持有对JFrame的强引用,这阻止了它被垃圾收集,并最终导致抛出OutOfMemoryError.
若要查看该问题,请运行此问题,最大堆大小为200 MB.每次打开一个窗口时,它都会消耗50兆字节的RAM.打开三个窗口(使用150兆字节的RAM).然后关闭三个窗口(调用dispose),这将释放内存.然后尝试打开第四个窗口.抛出OutOfMemoryError,第四个窗口无法打开.
我已经看到了其他答案,说明在必要时会自动释放内存以避免耗尽,但这似乎并没有发生.
package com.prosc.swing;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;
public class WindowLeakTest {
public static void main(String[] args) {
EventQueue.invokeLater( new Runnable() {
public void run() {
JFrame launcherWindow = new JFrame( "Launcher window" );
JButton launcherButton = new JButton( "Open new JFrame" );
launcherButton.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
JFrame subFrame = new JFrame( "Sub frame" ) {
private byte[] bigMemoryChunk = new byte[ …Run Code Online (Sandbox Code Playgroud) java ×10
swing ×7
jfreechart ×2
jscrollpane ×2
dump ×1
heap ×1
javafx ×1
javafx-2 ×1
jtextarea ×1
memory ×1
memory-leaks ×1
pagination ×1
performance ×1
renderer ×1
repaint ×1
swingworker ×1
tablemodel ×1
thumbnails ×1