Java heap space ошибка как исправить dbeaver

System information: DBeaver version: Version 21.0.0.202103021012 Additional extensions: NON Connection specification: Database name and version Driver name Do you use tunnels or proxies (SSH, SOCKS...

This issue was moved to a discussion.

You can continue the conversation there.

Go to discussion →

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.

Already on GitHub?
Sign in
to your account


Closed

chan18 opened this issue

Apr 8, 2021

· 7 comments


Closed

Java heap space

#12048

chan18 opened this issue

Apr 8, 2021

· 7 comments

Comments

@chan18

System information:

image

  • DBeaver version: Version 21.0.0.202103021012
  • Additional extensions: NON

Connection specification:

  • Database name and version
  • Driver name
  • Do you use tunnels or proxies (SSH, SOCKS, etc)?

Describe the problem you’re observing:

Java heap space

image

Steps to reproduce, if exist:

view the database (f4) will show the ER-Digaram of the database.
save the generated ER-Digram

@kseniiaguzeeva

@ITshoushou1

image
I got the error too when i export a large table data from database

@chan18

Q) Is it embedded?
A) not sure what you mean by embedded database I assume it is local-DB, I have connected to the remote database.

soon, I will share my logs. Let me try again.
Thanks for your reply @kseniiaguzeeva

@yhuihu

I have the same question.

@ardelean94

I have a similar scenario, I’m trying to connect to a remote Impala DB using DBeaver, I’ve downloaded and created the jdbc driver but when I try to connect I get an error, see print screen attached
image

Any ideas?

@serge-rider

@chan18 Perhaps you have a huge schema (hundreds/thousands of tables with many columns).
@ardelean94 Impala JDBC driver needs a lot of memory.

By default DBeaver Community has maximum memory limit 1gb.
You can increase this limit in dbeaver.ini file.
Try to change -Xmx1024m into -Xmx4096m to increase maximum memory to 4Gb.

@chan18

hi @serge-rider incressing the ram size from 1gb to 4gb in the dbeaver.ini file fixed my issue.

@dbeaver
dbeaver

locked and limited conversation to collaborators

May 17, 2021

This issue was moved to a discussion.

You can continue the conversation there.

Go to discussion →

Bug report — Export Data feature frezees on large table

Bug report — Export Data feature frezees on large table

I’m using Export Data to export a table with 600.000+ registers in it. It freezes at around 90% work done.

Dbeaver version: 3.3.1 enterprise
Database: PostgreSQL 9.1
Settings:
Data transfer type: Database

Extraction:
Extract type: By Segments
Segment Size: tried 10000 and 5000
Open new connection: tried true and false
Select row count: true

Mapping: new (new table)

Load:
Open new connection: tried true and false
Use transactions: tried true and false
Commit after insert of: tried 10000 and 5000

nelson777
 
Posts: 10
Joined: Wed Feb 12, 2014 1:45 pm

Re: Bug report — Export Data feature frezees on large table

Postby Serge » Thu Apr 16, 2015 5:24 am

Hey,

Did you try to use extraction type «single query»? Usually it is much faster than by segments.

And I can’t reproduce this issue. 600k rows isn’t a big number, I just transfered table with about 4m records from/into postgresql database without problems in 2 minutes.
What is source database for you export and what is target?

Serge
 
Posts: 1526
Joined: Sat Feb 26, 2011 8:24 pm
Location: SPb
  • Website

Re: Bug report — Export Data feature frezees on large table

Postby nelson777 » Thu Apr 16, 2015 4:24 pm

Tried with single query, got the following error:

An internal error occurred during: «Export data from «tmp_log»».
Could not initialize class java.sql.SQLException

I didn’t remember to say that the error I get with BySegments is «Java heap space». Knowing Eclipse and it’s derivations from a long time I inserted -Xms512M -Xmx3072M in dbeaver.ini, but the problem continued.
Because the problem was heap space, I didn’t try single query, because I thought it would be an even more memory intensive operation. Anyway, it didn’t work either.

I’m on a i5-2400 CPU, 8G RAM, Ubuntu 12.04 32bits, corporative machine.

Any other ideas ?

nelson777
 
Posts: 10
Joined: Wed Feb 12, 2014 1:45 pm


Re: Bug report — Export Data feature frezees on large table

Postby nelson777 » Thu Apr 16, 2015 5:48 pm

Sorry it was still missing this info you requested earlier. But it’s 2 postgres 9.1 databases. Worst: they’re both in localhost, I’m not doing any network communication here.

I’m using Oracle’s Java version «1.7.0_51»

-Nelson

nelson777
 
Posts: 10
Joined: Wed Feb 12, 2014 1:45 pm

Re: Bug report — Export Data feature frezees on large table

Postby Serge » Thu Apr 16, 2015 6:51 pm

Finally I was able to reproduce it. My previous test table was too small and fit into memory :)
I’m afraid there is no workaround for this problem in 3.3.1. By default PostgreSQL driver doesn’t support results scrolling. And there is no way to change this option in UI.
I’ll fix this issue in the next version (see it on the next week).

Serge
 
Posts: 1526
Joined: Sat Feb 26, 2011 8:24 pm
Location: SPb
  • Website

Re: Bug report — Export Data feature frezees on large table

Postby nelson777 » Thu Apr 16, 2015 7:08 pm

OK Serge. As usual you are very helpful. Thanks for that.

nelson777
 
Posts: 10
Joined: Wed Feb 12, 2014 1:45 pm


Return to Support

Who is online

Users browsing this forum: Google [Bot] and 23 guests

  1. Upto my knowledge, Heap space is occupied by instance variables only. If this is correct, then why this error occurred after running fine for sometime as space for instance variables are alloted at the time of object creation.

That means you are creating more objects in your application over a period of time continuously. New objects will be stored in heap memory and that’s the reason for growth in heap memory.

Heap not only contains instance variables. It will store all non-primitive data types ( Objects). These objects life time may be short (method block) or long (till the object is referenced in your application)

  1. Is there any way to increase the heap space?

Yes. Have a look at this oracle article for more details.

There are two parameters for setting the heap size:

-Xms:, which sets the initial and minimum heap size

-Xmx:, which sets the maximum heap size

  1. What changes should I made to my program so that It will grab less heap space?

It depends on your application.

  1. Set the maximum heap memory as per your application requirement

  2. Don’t cause memory leaks in your application

  3. If you find memory leaks in your application, find the root cause with help of profiling tools like MAT, Visual VM , jconsole etc. Once you find the root cause, fix the leaks.

Important notes from oracle article

Cause: The detail message Java heap space indicates object could not be allocated in the Java heap. This error does not necessarily imply a memory leak.

Possible reasons:

  1. Improper configuration ( not allocating sufficiant memory)
  2. Application is unintentionally holding references to objects and this prevents the objects from being garbage collected
  3. Applications that make excessive use of finalizers. If a class has a finalize method, then objects of that type do not have their space reclaimed at garbage collection time. If the finalizer thread cannot keep up, with the finalization queue, then the Java heap could fill up and this type of OutOfMemoryError exception would be thrown.

On a different note, use better Garbage collection algorithms ( CMS or G1GC)

Have a look at this question for understanding G1GC

  1. Upto my knowledge, Heap space is occupied by instance variables only. If this is correct, then why this error occurred after running fine for sometime as space for instance variables are alloted at the time of object creation.

That means you are creating more objects in your application over a period of time continuously. New objects will be stored in heap memory and that’s the reason for growth in heap memory.

Heap not only contains instance variables. It will store all non-primitive data types ( Objects). These objects life time may be short (method block) or long (till the object is referenced in your application)

  1. Is there any way to increase the heap space?

Yes. Have a look at this oracle article for more details.

There are two parameters for setting the heap size:

-Xms:, which sets the initial and minimum heap size

-Xmx:, which sets the maximum heap size

  1. What changes should I made to my program so that It will grab less heap space?

It depends on your application.

  1. Set the maximum heap memory as per your application requirement

  2. Don’t cause memory leaks in your application

  3. If you find memory leaks in your application, find the root cause with help of profiling tools like MAT, Visual VM , jconsole etc. Once you find the root cause, fix the leaks.

Important notes from oracle article

Cause: The detail message Java heap space indicates object could not be allocated in the Java heap. This error does not necessarily imply a memory leak.

Possible reasons:

  1. Improper configuration ( not allocating sufficiant memory)
  2. Application is unintentionally holding references to objects and this prevents the objects from being garbage collected
  3. Applications that make excessive use of finalizers. If a class has a finalize method, then objects of that type do not have their space reclaimed at garbage collection time. If the finalizer thread cannot keep up, with the finalization queue, then the Java heap could fill up and this type of OutOfMemoryError exception would be thrown.

On a different note, use better Garbage collection algorithms ( CMS or G1GC)

Have a look at this question for understanding G1GC

Recommend Projects

  • React photo

    React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo

    Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo

    Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo

    TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo

    Django

    The Web framework for perfectionists with deadlines.

  • Laravel photo

    Laravel

    A PHP framework for web artisans

  • D3 photo

    D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Visualization

    Some thing interesting about visualization, use data art

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo

    Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo

    Microsoft

    Open source projects and samples from Microsoft.

  • Google photo

    Google

    Google ❤️ Open Source for everyone.

  • Alibaba photo

    Alibaba

    Alibaba Open Source for everyone

  • D3 photo

    D3

    Data-Driven Documents codes.

  • Tencent photo

    Tencent

    China tencent open source team.

В JVM, если 98% времени используется для GC (сборка мусора) и доступный размер кучи меньше 2%, будет выдано сообщение об исключении java.lang.OutOfMemoryError: Java heap space. 

Итак, обычно есть две причины этой аномалии:
1. В программе есть бесконечный цикл.
2. Программа занимает слишком много памяти, что превышает максимальное значение, установленное кучей JVM.
В первом случае вам необходимо самостоятельно проверить программный код, поэтому я не буду здесь говорить больше.
Во втором случае мы вручную расширяем настройки параметров кучи JVM. Настройка кучи JVM относится к настройке пространства памяти, которое JVM может выделить и использовать во время выполнения программы java. Когда JVM запускается, куча JVM автоматически устанавливает значение размера кучи. Обычно значение по умолчанию для начального пространства (например, -Xms) составляет 1/64 физической памяти, а максимальное пространство составляет 1/4 физической памяти. Его можно установить с помощью таких параметров, как -Xmn -Xms -Xmx, предоставляемых JVM. Вот объяснение значения каждого параметра:
-Xms: начальное значение
-Xmx: максимум
-Xmn: минимальное значение
Размер кучи не должен быть слишком маленьким или слишком большим. Если параметр слишком мал, скорость отклика программы будет ниже, потому что сборщик мусора занимает больше времени, а приложение выделяет меньше времени на выполнение. Слишком большой размер также приведет к потере места и повлияет на нормальную работу других программ. Размер кучи не должен превышать 80% доступной физической памяти. Рекомендуется установить одинаковые параметры -Xms и -Xmx, а -Xmn составляет 1/4 значения -Xmx.
Основные методы настройки следующие:
1. Этот параметр добавляется при выполнении файла класса JAVA, где className — это имя класса, который необходимо выполнить. (Включая имя пакета) Например: java -Xms32m -Xmx800m className Это не только решает проблему, но и скорость выполнения намного выше, чем когда она не установлена. Если это тест разработки, вы также можете установить его прямо в eclipse. Введите -Xms32m -Xmx800m в аргументы виртуальной машины в Eclipse -> run -arguments.
2. Вы можете изменить системные переменные среды в Windows и добавить JAVA_OPTS = -Xms64m -Xmx512m.
3. Если вы используете tomcat под окнами, вы можете добавить в C: tomcat5.5.9 bin catalina.bat (конкретный путь зависит от местоположения вашего tomcat): установить JAVA_OPTS = -Xms64m -Xmx256m (размер зависит от вашей собственной памяти) Местоположение: rem Угадайте CATALINA_HOME, если не определено Добавьте соответствующее в этой строке.
4. Если это система Linux, добавьте набор JAVA_OPTS = ’- Xms64 -Xmx512’ перед {tomcat_home} /bin/catalina.sh
Поскольку программе необходимо прочитать около 10 Вт строк записей из данных для обработки, возникает ошибка типа java.lang.OutOfMemoryError: пространство кучи Java появляется при чтении 9 Вт.
Проверка в Интернете может быть причиной того, что параметр стека JAVA слишком мал.
Согласно ответам в Интернете, существует примерно два решения:
1. Задайте переменные среды.
set JAVA_OPTS= -Xms32m -Xmx512m
можно изменить в соответствии с объемом памяти вашего компьютера, но моя проверка этого метода не решила проблему. Это может быть где еще нужно установить.

2、java -Xms32m -Xmx800m className
— добавить этот параметр при выполнении файла класса JAVA, где className — это фактическое имя класса, который должен быть выполнен. (Включая название пакета)
Это решает проблему. И скорость выполнения намного выше, чем без настройки.

Если вы можете использовать Eclispe при тестировании, вам необходимо ввести параметр -Xms32m -Xmx800m в аргументы виртуальной машины в Eclipse -> run -arguments.

java.lang.OutOfMemoryError: Java heap space

Исключение возникает при использовании программы Java для запроса большого количества данных из базы данных:
java.lang.OutOfMemoryError: Java heap space

В JVM, если 98% времени используется для сборки мусора, а доступный размер кучи меньше 2%, будет выдано это сообщение об исключении.

Настройка кучи JVM относится к настройке пространства памяти, которое JVM может выделить и использовать во время выполнения программы java.

JVM автоматически установит значение размера кучи при запуске.Его начальное пространство (-Xms) составляет 1/64 физической памяти, а максимальное пространство (-Xmx) — 1/4 физической памяти. Его можно установить с помощью таких параметров, как -Xmn -Xms -Xmx, предоставляемых JVM.
Например: java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar

Если размер кучи установлен слишком маленьким, в дополнение к этим аномальным сообщениям вы обнаружите, что скорость отклика программы снижается. Сборщик мусора занимает больше времени, а приложение выделяет меньше времени на выполнение.

Размер кучи не должен превышать 80% доступной физической памяти.Обычно для параметров -Xms и -Xmx должны быть установлены одинаковые значения, а -Xmn составляет 1/4 значения -Xmx.
Параметры размера кучи -Xms -Xmn не должны превышать размер физической памяти. В противном случае появится сообщение «Ошибка при инициализации виртуальной машины. Не удалось зарезервировать достаточно места для кучи объектов».

==========================================================
После ночи напряженной работы я наконец завершил программу замены файлов для указанной строки, но поскольку я хочу заменить слишком много файлов html для общесайтовой программы, поэтому затмение всегда заканчивается в каталоге После сообщения об исключении java.lang.OutOfMemoryError: пространство кучи Java произошел сбой.

Я подумал, что слишком поздно перерабатывать из-за частых операций, поэтому я добавил Thread.sleep (1000) после каждого цикла и обнаружил, что он умрет в этом каталоге, поэтому я изменил 1000 на 5000 или умер там. Я думаю, что это может быть не так просто перерабатывать, возможно, JVM Sun просто не выпускает для этой ситуации.
Затем я добавил -Xmx256M к параметру запуска, на этот раз все было нормально.

Подумав об этом, я до сих пор мало что знаю о принципах сборки мусора, я проверил это в Интернете и нашел несколько хороших статей.

http://java.ccidnet.com/art/3539/20060314/476073_1.html
http://www.pconline.com.cn/pcedu/empolder/gj/java/0509/701281.html

Также существуют: Управление кучей Java — сборка мусора. Следует отметить следующие моменты, которые могут использоваться в качестве рекомендаций при написании программ:

(1) Не пытайтесь предполагать время, когда происходит сборка мусора, причем все это неизвестно. Например, временный объект в методе становится бесполезным после вызова метода, и его память может быть освобождена в это время.

(2) Java предоставляет несколько классов, которые занимаются сборкой мусора, и предоставляет способ принудительного вызова функции сборки мусора System.gc (), но это также ненадежный метод. Java не гарантирует, что сборка мусора будет запускаться каждый раз при вызове этого метода. Она просто отправляет такой запрос в JVM. Неизвестно, выполняется ли сборка мусора на самом деле.

(3) Выберите подходящий вам сборщик мусора. Вообще говоря, если система не предъявляет особых требований к производительности, вы можете использовать параметры JVM по умолчанию. В противном случае вы можете рассмотреть возможность использования целевых сборщиков мусора.Например, инкрементные сборщики больше подходят для систем с высокими требованиями к работе в реальном времени. Система имеет более высокую конфигурацию и больше простаивающих ресурсов, вы можете рассмотреть возможность использования параллельного сборщика меток / разверток.

(4) Ключевая и сложная проблема — это утечки памяти. Хорошие навыки программирования и строгое отношение к программированию всегда являются самыми важными. Не позволяйте небольшой собственной ошибке вызвать большую дыру в памяти.

(5) Освободите ссылки на бесполезные объекты как можно скорее.
Когда большинство программистов используют временные переменные, они автоматически устанавливают для ссылочной переменной значение null после выхода из активной области (области), что означает, что сборщик мусора будет собирать объект. Вы должны обратить внимание на то, отслеживается ли объект, на который указывает ссылка, если да, удалите прослушиватель, а затем назначьте нулевое значение.

Другими словами, лучше контролировать операции частого обращения к памяти и освобождения памяти самостоятельно, но метод System.gc () может быть неприменим. Лучше использовать finalize для принудительного выполнения или написать свой собственный метод finalize.

================================================
tomcat

Я обнаружил ошибку TOMCAT: java.lang.OutOfMemoryError: пространство кучи Java, поэтому я проверил информацию и нашел решение:
If Java runs out of memory, the following error occurs:
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
Java heap size can be increased as follows:

java -Xms -Xmx
Defaults are:
java -Xms32m -Xmx128m

Если вы используете выигрыш
/tomcat/bin/catalina.bat плюс следующая команда:
set JAVA_OPTS=-Xms32m -Xmx256m

Если вы используете unix / linux
/tomcat/bin/catalina.sh плюс следующая команда:
JAVA_OPTS=»-Xms32m -Xmx256m»

инструмент просмотра и анализа памяти jvm
В отрасли существует множество мощных инструментов для профилей Java, таких как Jporfiler и yourkit. Я не хочу говорить об этих платных вещах. Я хочу сказать, что сама java обеспечивает большой мониторинг памяти. Маленькие инструменты, перечисленные ниже инструменты — лишь небольшая часть. Все еще довольно интересно внимательно изучить инструменты jdk :)

1: вывод журнала gc

      Добавьте -XX: + PrintGC -XX: + PrintGCDetails -XX: + PrintGCTimestamps -XX: + PrintGCApplicationStopedTime к параметрам запуска jvm, jvm выведет сводную информацию gc, подробную информацию, информацию о времени gc и приложения, вызванные gc, в порядке этих параметров. Время паузы. Если вы добавите параметр -Xloggc: путь к файлу после параметра прямо сейчас, информация gc будет выводиться в указанный файл. Другие параметры включают

-verbose: gc и -XX: + PrintTenuringDistribution и т. д.

2:jconsole

    jconsole - это инструмент анализа памяти, который поставляется с jdk, который предоставляет графический интерфейс. Вы можете просматривать информацию о памяти, информацию о потоках, информацию о загрузке классов и информацию о MBean отслеживаемом jvm.

  jconsole находится в каталоге bin в каталоге jdk. Это jconsole.exe в Windows и jconsole.sh в Unix и Linux. jconsole может контролировать локальные приложения и удаленные приложения. Чтобы отслеживать локальные приложения, выполните jconsole pid, pid - это идентификатор запущенного java-процесса, если вы не укажете параметр pid, после выполнения команды jconsole вы увидите всплывающее диалоговое окно, локальный java-процесс указан выше, вы можете выбрать один Для мониторинга. Если вы хотите контролировать удаленно, вы должны добавить что-то в параметр jvm удаленного сервера, потому что удаленный мониторинг jconsole основан на jmx. Подробнее об использовании jconsole см. В статье, посвященной jconsle. Я также подробно расскажу о jconsole в блоге. .

3:jviusalvm

    После обновления JDK6 7 jdk запустил еще один инструмент: jvisualvm, виртуальную машину визуализации java, которая не только предоставляет функции, аналогичные jconsole, но также обеспечивает диагностику памяти jvm и процессора в реальном времени, а также ручной дамп памяти jvm и ручное выполнение. gc.

   Как и jconsole, запустите jviusalvm, выполните jviusalvm в каталоге bin jdk, jviusalvm.exe под Windows, jviusalvm.sh под linux и unix.

4:jmap

jmap - это инструмент анализа памяти jvm, который поставляется с jdk и находится в каталоге bin jdk. Использование команды jmap в jdk1.6:

Код коллекции HTML-кода
Usage:
jmap -histo (to connect to running process and print histogram of java object heap
jmap -dump: (to connect to running process and dump java heap)
dump-options: format=b binary default file=
dump heap to
Example: jmap -dump:format=b,file=heap.bin

jmap -histo <pid> отображает на экране состояние памяти jvm указанного pid. Возьмем, к примеру, мой компьютер, выполните эту команду, на экране отобразится:

Код коллекции HTML-кода
1: 24206 2791864 < constMethodKlass >
2: 22371 2145216 [C
3: 24206 1940648 < methodKlass >
4: 1951 1364496 < constantPoolKlass >
5: 26543 1282560 < symbolKlass >
6: 6377 1081744 [B
7: 1793 909688 < constantPoolCacheKlass >
8: 1471 614624 < instanceKlassKlass >
9: 14581 548336 [Ljava.lang.Object;
10: 3863 513640 [I
11: 20677 496248 java.lang.String
12: 3621 312776 [Ljava.util.HashMap

E

n

t

r

y

;

13

:

3335266800

j

a

v

a

.

l

a

n

g

.

r

e

f

l

e

c

t

.

M

e

t

h

o

d

14

:

8256264192

j

a

v

a

.

i

o

.

O

b

j

e

c

t

S

t

r

e

a

m

C

l

a

s

s

Entry; 13: 3335 266800 java.lang.reflect.Method 14: 8256 264192 java.io.ObjectStreamClass

WeakClassKey
15: 7066 226112 java.util.TreeMap

E

n

t

r

y

16

:

2355173304

[

S

17

:

1687161952

j

a

v

a

.

l

a

n

g

.

C

l

a

s

s

18

:

2769150112

[

[

I

19

:

3563142520

j

a

v

a

.

u

t

i

l

.

H

a

s

h

M

a

p

20

:

5562133488

j

a

v

a

.

u

t

i

l

.

H

a

s

h

M

a

p

Entry 16: 2355 173304 [S 17: 1687 161952 java.lang.Class 18: 2769 150112 [[I 19: 3563 142520 java.util.HashMap 20: 5562 133488 java.util.HashMap

Entry
Total 239019 17140408
Чтобы облегчить просмотр, я удалил несколько строк. Из приведенной выше информации легко увидеть, что #instance относится к количеству объектов, #bytes относится к объему памяти, занимаемой этими объектами, а имя класса относится к типу объекта.

  Снова посмотрите на параметр dump jmap: он выводит информацию о памяти кучи jvm в файл и выполняет его на моей машине.

jmap -dump:file=c:dump.txt 340

Обратите внимание, что 340 — это pid java-процесса моей машины. Размер выгруженного файла превышает 10 мегабайт, и я только что открыл tomcat и запустил очень простое приложение без какого-либо доступа. Его можно представить на большом и загруженном сервере. , Насколько большим должен быть файл дампа? Что вам нужно знать, так это то, что информация о файле дампа очень примитивна и определенно не подходит для просмотра людьми напрямую, а содержимое, отображаемое jmap -histo, слишком простое, например, оно только показывает, сколько памяти занимают определенные типы объектов и количество этих объектов. , Но нет более подробной информации, например, кто создал эти объекты. Итак, какая польза от файла дампа? Конечно полезно, потому что есть инструмент для анализа файла дампа памяти jvm.

5:jhat

Как упоминалось выше, существует множество инструментов, которые могут анализировать файл дампа памяти jvm, jhat - это инструмент, который поставляется с sun jdk6 и выше, расположен в каталоге bin jdk, выполнить jhat -J -Xmx512m [file], file - это путь к файлу дампа. В jhat встроен простой веб-сервер. После выполнения этой команды jhat отображает адрес доступа к результату анализа в командной строке. Вы можете использовать параметр -port, чтобы указать порт. Для конкретного использования вы можете выполнить jhat -heap для просмотра справочной информации. После доступа по указанному адресу вы можете увидеть информацию, отображаемую на странице, которая намного богаче и детальнее, чем команда jmap -histo.

6: анализатор памяти eclipse

Вышеупомянутый jhat, он может анализировать файл дампа jvm, но это все текстовое отображение, анализатор памяти eclipse, это подключаемый модуль, предоставляемый eclipse для анализа дампа кучи jvm, веб-сайт http://www.eclipse.org/mat, Скорость его анализа выше, чем у jhat, а результат анализа отображается в графическом интерфейсе, который более читабелен, чем jhat. Фактически, jvisualvm также может анализировать файлы дампа, которые также отображаются в графическом интерфейсе.

7:jstat

    Если jmap имеет тенденцию анализировать информацию об объекте в памяти jvm, то jsta стремится анализировать ситуацию gc с памятью jvm. Оба являются инструментами анализа памяти JVM, но, очевидно, они анализируются с разных сторон. Существует множество часто используемых параметров jsat, таких как -gc, -gcutil, -gccause. Конкретные функции этих параметров можно просмотреть в справочной информации jsat. Я часто использую -gcutil. Функция этого параметра постоянно отображает информацию о сборке мусора в текущей указанной памяти jvm. .

     На этом компьютере я выполняю jstat -gcutil 340 10000. Эта команда выводит информацию gc jvm каждые 10 секунд. 10000 обозначает интервал в 10000 миллисекунд. На экране отображается следующая информация (я взял только первую строку, потому что она отображается с определенной частотой, поэтому при фактическом исполнении строк будет много):

S0 S1 E O P YGC YGCT FGC FGCT GCT
54.62 0.00 42.87 43.52 86.24 1792 5.093 33 7.670 12.763

        количество. . . Как это сказать, чтобы понять, что означает эта информация, вы также должны иметь определенное представление о механизме gc в jvm. На самом деле, если вы знаете gc jvm горячей точки солнца, вам будет легко понять эту информацию, но люди, не знакомые с механизмом gc, немного необъяснимы, поэтому здесь я сначала расскажу о механизме gc jvm солнца. Говоря о gc, на самом деле, это не просто концепция java. Фактически, до java во многих языках была концепция gc. GC означает сборку мусора. Это скорее алгоритмическая вещь, но с определенными языками. Это не имеет большого значения, поэтому об истории gc я не буду говорить о мейнстримовом алгоритме gc. Это слишком далеко, и это ерунда. Текущая JVM Sun, модель управления памятью - это модель поколений, поэтому, конечно, сборщик мусора собирается поколениями. Что означают поколения? Он состоит в том, чтобы разделить объект на три уровня в соответствии с жизненным циклом, а именно: новое поколение, старое поколение и постоянное поколение. Когда объекты распределяются впервые, большинство из них находятся в кайнозое. Когда запускается представление кайнозойского GC, GC в кайнозойском диапазоне выполняется один раз. Это называется второстепенным GC. Если второстепенный GC выполняется несколько раз, объекты все еще остаются. Выжить, передать эти объекты старому поколению, потому что эти объекты проверены организацией. Частота gc старого поколения будет ниже. Если старое поколение выполняет gc, это полный gc, потому что это не частичный gc, а gc во всем диапазоне памяти. Это приведет к приостановке приложения, потому что полный сбор памяти должен быть заблокирован Память, никакие новые объекты не могут быть выделены в память.Постоянная генерация - это некоторые объекты, которые не исчезнут в течение периода JVM, такие как определение класса, информация области метода JVM, например статические блоки. Главное, что новое поколение разделено на три пространства: eden, susvivor0 и susvivor1. В буквальном понимании это Eden Park, Survival Zone 1 и Survival Zone 2. Новые объекты размещаются в области eden. Когда область eden заполнена, используется алгоритм mark-copy, то есть выжившие объекты в области eden извлекаются, и эти объекты копируются в s0 или s1, а затем область eden очищается. Gc jvm не так уж прост. Например, есть последовательный сбор, параллельный сбор, параллельный сбор и знаменитый алгоритм поезда, но это слишком далеко, чтобы говорить, хорошо иметь общее представление об этом сейчас. Сказав это, давайте посмотрим на вывод информации выше:

S0 S1 E O P YGC YGCT FGC FGCT GCT
54.62 0.00 42.87 43.52 86.24 1792 5.093 33 7.670 12.763

S0: Зона susvivor0 нового поколения, коэффициент использования площадей 54 … 62%

S1: область susvivor1 нового поколения, коэффициент использования пространства составляет 0,00% (поскольку второй второстепенный сбор не был выполнен)

E: район Эдем, коэффициент использования площадей — 42,87%

О: Старое поколение, коэффициент использования площадей 43,52%

P: постоянный ремень, коэффициент использования пространства 86,24%

YGC: Незначительное время выполнения gc 1792 раза

YGCT: незначительное время gc затрачено 5,093 миллисекунды

FGC: полное выполнение gc раз 33

FGCT: полный gc занимает 7,670 миллисекунд

GCT: общее время, затрачиваемое gc, составляет 12,763 миллисекунды.

Исходный адрес:https://www.cnblogs.com/bolang100/p/6478537.html

Понравилась статья? Поделить с друзьями:
  • Java executable not found error
  • Java createprocess error 206 the filename or extension is too long
  • Java create new file error
  • Java cmd createprocess error 2
  • Java check error type