2014-06-11 35 views
8

Mam plik zrzutu pamięci, który zawiera prawie 5000 wystąpień określonego obiektu. Te obiekty mają być zapisane w DB, a sposób w jaki robię to jest napisanie zapytania OQL w jvisualvm, aby wygenerować ciąg, który będzie służyć jako wstawka SQL na przykład Zwiększanie maksymalnego rozmiaru zestawu wyników JvisualVM OQL

select "insert into trades (id, tradeNumber) values ("+ x.id+ ", " + x.tradeNumber +");" from com.test.application.TradeObject x; 

Kiedy uruchomię to przez OQL, otrzymam wynikiem ustawić tak -

<code> 
insert into trades (id, tradeNumber) values (1,12345); 
insert into trades (id, tradeNumber) values (2,123456); 
insert into trades (id, tradeNumber) values (3,123457); </code> 

itp

Jednakże, ponieważ łączna liczba przypadków jest duża (około 5000) JvisualVM pokazuje tylko około 100 z nich. a następnie błędy z komunikatem "Zbyt wiele wyników. Proszę zawęzić zapytanie."

Nie mogę zawęzić zapytania, ponieważ muszę analizować wszystkie wystąpienia w ten sposób. Czy istnieje sposób, w jaki mogę poprosić JvisualVM, aby pokazała mi wszystkie wystąpienia i nie ograniczyła liczby wyników?

Widzę również, że Jvisual vm pokazuje pierwsze 100 instancji bez filtrów, czy można uzyskać następne 100 wystąpień itd. Za pomocą zapytania OQL?

Dzięki

Odpowiedz

7

nie mogłem znaleźć żadnych ustawień w jvisualVm aby zwiększyć rozmiar wynikowego. Być może nie jest to możliwe w ten sposób. Wygląda na twardy zakodowany limit w bazie kodu Jvisualvm. Ref: http://visualvm.sourcearchive.com/documentation/1.3/OQLController_8java-source.html

Poniżej znajdują się fragmenty tam:

final AtomicInteger counter = new AtomicInteger(100); 

i

if (counter.get() == 0) { 
sb.append("<tr><td><h4>Too many results. Please, refine your query.</h4></td></tr>"); 
} else if (counter.get() == 100) { 
sb.append("<tr><td><h4>"); // NOI18N 
sb.append(NbBundle.getMessage(OQLController.class, "OQL_NO_RESULTS_MSG")); // NOI18N 
sb.append("</h4></td></tr>"); // NOI18N 
} 

Teraz ciekawe strony, obejście problemu.

Rozważmy klasę poniżej:

package com.demo.test; 
class Xyz { 
     int idXyz;// intentionally not set as id 
     String value; 

     public Xyz(int idXyz, String value) { 
      this.idXyz = idXyz; 
      this.value = value; 
     } 
    } 

teraz, że mam 105 obiektów w pamięci dla tej klasy, trzymane w liście, jak:

 static List<Xyz> lst = new ArrayList<>(); 
     for (int i = 0; i < 105; i++) { 
      lst.add(new Xyz(i,"xyz value-" + i)); 
     } 

i muszę osiągnąć to, co robisz .

Teraz, aby wyświetlić te 105 obiektów zamiast wyświetlać wszystkie zestawy wyników, wolałbym iterować po wszystkich obiektach i utworzyć pojedynczy ciąg zawierający wszystkie zapytania SQL oddzielone nowym wierszem. W tym celu należy wywołać podobny skrypt OQL w Query Editor.

function fun(objEnumeration){ 
var res =" "; 
while (objEnumeration.hasMoreElements()) { 
    var itr = objEnumeration.nextElement(); 
    var v = "insert into table_Xyz (idXyz, value) values ("+ itr.idXyz.toString()+ ", " + itr.value.toString() +");\n" 
    res = res + v; 
} 
return res; 
} 

fun(heap.objects("com.demo.test.Xyz")); 

a wynik w karcie Query Results będą:

insert into table_Xyz (idXyz, value) values (104, xyz value-104); 
insert into table_Xyz (idXyz, value) values (103, xyz value-103); 
insert into table_Xyz (idXyz, value) values (102, xyz value-102); 
insert into table_Xyz (idXyz, value) values (101, xyz value-101); 
insert into table_Xyz (idXyz, value) values (100, xyz value-100); 
insert into table_Xyz (idXyz, value) values (99, xyz value-99); 
insert into table_Xyz (idXyz, value) values (98, xyz value-98); 
insert into table_Xyz (idXyz, value) values (97, xyz value-97); 
insert into table_Xyz (idXyz, value) values (96, xyz value-96); 
insert into table_Xyz (idXyz, value) values (95, xyz value-95); 
insert into table_Xyz (idXyz, value) values (94, xyz value-94); 
insert into table_Xyz (idXyz, value) values (93, xyz value-93); 
insert into table_Xyz (idXyz, value) values (92, xyz value-92); 
insert into table_Xyz (idXyz, value) values (91, xyz value-91); 
insert into table_Xyz (idXyz, value) values (90, xyz value-90); 
insert into table_Xyz (idXyz, value) values (89, xyz value-89); 
insert into table_Xyz (idXyz, value) values (88, xyz value-88); 
insert into table_Xyz (idXyz, value) values (87, xyz value-87); 
insert into table_Xyz (idXyz, value) values (86, xyz value-86); 
insert into table_Xyz (idXyz, value) values (85, xyz value-85); 
insert into table_Xyz (idXyz, value) values (84, xyz value-84); 
insert into table_Xyz (idXyz, value) values (83, xyz value-83); 
insert into table_Xyz (idXyz, value) values (82, xyz value-82); 
insert into table_Xyz (idXyz, value) values (81, xyz value-81); 
insert into table_Xyz (idXyz, value) values (80, xyz value-80); 
insert into table_Xyz (idXyz, value) values (79, xyz value-79); 
insert into table_Xyz (idXyz, value) values (78, xyz value-78); 
insert into table_Xyz (idXyz, value) values (77, xyz value-77); 
insert into table_Xyz (idXyz, value) values (76, xyz value-76); 
insert into table_Xyz (idXyz, value) values (75, xyz value-75); 
insert into table_Xyz (idXyz, value) values (74, xyz value-74); 
insert into table_Xyz (idXyz, value) values (73, xyz value-73); 
insert into table_Xyz (idXyz, value) values (72, xyz value-72); 
insert into table_Xyz (idXyz, value) values (71, xyz value-71); 
insert into table_Xyz (idXyz, value) values (70, xyz value-70); 
insert into table_Xyz (idXyz, value) values (69, xyz value-69); 
insert into table_Xyz (idXyz, value) values (68, xyz value-68); 
insert into table_Xyz (idXyz, value) values (67, xyz value-67); 
insert into table_Xyz (idXyz, value) values (66, xyz value-66); 
insert into table_Xyz (idXyz, value) values (65, xyz value-65); 
insert into table_Xyz (idXyz, value) values (64, xyz value-64); 
insert into table_Xyz (idXyz, value) values (63, xyz value-63); 
insert into table_Xyz (idXyz, value) values (62, xyz value-62); 
insert into table_Xyz (idXyz, value) values (61, xyz value-61); 
insert into table_Xyz (idXyz, value) values (60, xyz value-60); 
insert into table_Xyz (idXyz, value) values (59, xyz value-59); 
insert into table_Xyz (idXyz, value) values (58, xyz value-58); 
insert into table_Xyz (idXyz, value) values (57, xyz value-57); 
insert into table_Xyz (idXyz, value) values (56, xyz value-56); 
insert into table_Xyz (idXyz, value) values (55, xyz value-55); 
insert into table_Xyz (idXyz, value) values (54, xyz value-54); 
insert into table_Xyz (idXyz, value) values (53, xyz value-53); 
insert into table_Xyz (idXyz, value) values (52, xyz value-52); 
insert into table_Xyz (idXyz, value) values (51, xyz value-51); 
insert into table_Xyz (idXyz, value) values (50, xyz value-50); 
insert into table_Xyz (idXyz, value) values (49, xyz value-49); 
insert into table_Xyz (idXyz, value) values (48, xyz value-48); 
insert into table_Xyz (idXyz, value) values (47, xyz value-47); 
insert into table_Xyz (idXyz, value) values (46, xyz value-46); 
insert into table_Xyz (idXyz, value) values (45, xyz value-45); 
insert into table_Xyz (idXyz, value) values (44, xyz value-44); 
insert into table_Xyz (idXyz, value) values (43, xyz value-43); 
insert into table_Xyz (idXyz, value) values (42, xyz value-42); 
insert into table_Xyz (idXyz, value) values (41, xyz value-41); 
insert into table_Xyz (idXyz, value) values (40, xyz value-40); 
insert into table_Xyz (idXyz, value) values (39, xyz value-39); 
insert into table_Xyz (idXyz, value) values (38, xyz value-38); 
insert into table_Xyz (idXyz, value) values (37, xyz value-37); 
insert into table_Xyz (idXyz, value) values (36, xyz value-36); 
insert into table_Xyz (idXyz, value) values (35, xyz value-35); 
insert into table_Xyz (idXyz, value) values (34, xyz value-34); 
insert into table_Xyz (idXyz, value) values (33, xyz value-33); 
insert into table_Xyz (idXyz, value) values (32, xyz value-32); 
insert into table_Xyz (idXyz, value) values (31, xyz value-31); 
insert into table_Xyz (idXyz, value) values (30, xyz value-30); 
insert into table_Xyz (idXyz, value) values (29, xyz value-29); 
insert into table_Xyz (idXyz, value) values (28, xyz value-28); 
insert into table_Xyz (idXyz, value) values (27, xyz value-27); 
insert into table_Xyz (idXyz, value) values (26, xyz value-26); 
insert into table_Xyz (idXyz, value) values (25, xyz value-25); 
insert into table_Xyz (idXyz, value) values (24, xyz value-24); 
insert into table_Xyz (idXyz, value) values (23, xyz value-23); 
insert into table_Xyz (idXyz, value) values (22, xyz value-22); 
insert into table_Xyz (idXyz, value) values (21, xyz value-21); 
insert into table_Xyz (idXyz, value) values (20, xyz value-20); 
insert into table_Xyz (idXyz, value) values (19, xyz value-19); 
insert into table_Xyz (idXyz, value) values (18, xyz value-18); 
insert into table_Xyz (idXyz, value) values (17, xyz value-17); 
insert into table_Xyz (idXyz, value) values (16, xyz value-16); 
insert into table_Xyz (idXyz, value) values (15, xyz value-15); 
insert into table_Xyz (idXyz, value) values (14, xyz value-14); 
insert into table_Xyz (idXyz, value) values (13, xyz value-13); 
insert into table_Xyz (idXyz, value) values (12, xyz value-12); 
insert into table_Xyz (idXyz, value) values (11, xyz value-11); 
insert into table_Xyz (idXyz, value) values (10, xyz value-10); 
insert into table_Xyz (idXyz, value) values (9, xyz value-9); 
insert into table_Xyz (idXyz, value) values (8, xyz value-8); 
insert into table_Xyz (idXyz, value) values (7, xyz value-7); 
insert into table_Xyz (idXyz, value) values (6, xyz value-6); 
insert into table_Xyz (idXyz, value) values (5, xyz value-5); 
insert into table_Xyz (idXyz, value) values (4, xyz value-4); 
insert into table_Xyz (idXyz, value) values (3, xyz value-3); 
insert into table_Xyz (idXyz, value) values (2, xyz value-2); 
insert into table_Xyz (idXyz, value) values (1, xyz value-1); 
insert into table_Xyz (idXyz, value) values (0, xyz value-0); 

tylko zmodyfikować skrypt OQL do własnych wymagań.

UWAGA: w klasie Xyz pole idXyz było intentionally not set as id, ponieważ w takim przypadku itr.id zwróci identyfikator obiektu powiązany z tą instancją.

dłużej na metodach OQL Ref: http://visualvm.java.net/oqlhelp.html#toHtml

1

Teraz jest to możliwe (v 1.7), z netbeans/profiler.heapwalker/src/org/netbeans/modules/profiler/heapwalk/OQLController.java:

private static final int RESULTS_LIMIT = \ 
    Integer.parseInt(System.getProperty("OQLController.limitResults", "100")); // NOI18N 

mój kod pomocniczy (jeśli pominąć limit - nieograniczona):

function loop1(iter, limit) { 
    if (!iter.hasNext()) 
    return "<b>Nothing found!</b>"; 
    var count = 0; 
    var html = ""; 
    while (true) { 
    if (count >= limit) 
     return "<b>First </b>" + limit + "<b> objects (not all):</b><br>" + html; 
    if (!iter.hasNext()) 
     return "<b>Total </b>" + count + "<b> objects:</b><br>" + html; 
    html += toHtml(iter.next()) + "<br>"; 
    count += 1; 
    } 
} 
function loop2(iter, limit) { 
    if (!iter.hasMoreElements()) 
    return "<b>Nothing found!</b>"; 
    var count = 0; 
    var html = ""; 
    while (true) { 
    if (count >= limit) 
     return "<b>First </b>" + limit + "<b> objects (not all):</b><br>" + html; 
    if (!iter.hasMoreElements()) 
     return "<b>Total </b>" + count + "<b> objects:</b><br>" + html; 
    html += toHtml(iter.nextElement()) + '<br>'; 
    count += 1; 
    } 
} 
function loop(iter, limit) { 
    if ('hasMoreElements' in iter) 
    return loop2(iter, limit); 
    return loop1(iter, limit); 
} 

loop(filter(heap.classes(), "/javax.mail./(it.name)"), 1000) // loop1 
loop(heap.objects('java.lang.ClassLoader'))     // loop2 

UPDATE Kolejny trik, który znalazłem jest przypisanie wartości do zmiennej:

x = filter(heap.objects("java.lang.String"), "/hibernate\\.ejb/(it.toString())") 
x 

Uzyskane w wyniku obiekt ma interfejs next()/hasNext() który jest używany przez widza. Domyślnie pokazywało 100 wpisów. Ale następne połączenie tylko:

x 

pokazane kolejne 100 wpisów i tak dalej ...!

7

Otwarte visualvm.conf file:

%JDK_HOME%\lib\visualvm\etc\visualvm.conf 

dodać do łańcucha rozpoczął

visualvm_default_options=".... 

nieruchomości z pożądanej wartości granicznej

-J-DOQLController.limitResults=999