VisualVM crashes: "EXCEPTION_ACCESS_VIOLATION"

I try to use VisualVM to profile my program, but it always crashes with a common same error message:

Waiting... Profiler Agent: Waiting for connection on port 5140 (Protocol version: 15) Profiler Agent: Established connection with the tool Profiler Agent: Local accelerated session Starting test 0 # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000c12e9d20, pid=4808, tid=11472 # # JRE version: Java(TM) SE Runtime Environment (8.0_31-b13) (build 1.8.0_31-b13) # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.31-b07 mixed mode windows-amd64 compressed oops) # Problematic frame: # C 0x00000000c12e9d20 # # Failed to write core dump. Minidumps are not enabled by default on client versions of Windows # # An error report file with more information is saved as: # C:\Users\Brendon\workspace\JavaFx\hs_err_pid4808.log Compiled method (c1) 10245 952 3 pathfinderGameTest.Pathfinder$$Lambda$4/1163157884::get$Lambda (10 bytes) total in heap [0x00000000027d72d0,0x00000000027d7798] = 1224 relocation [0x00000000027d73f0,0x00000000027d7430] = 64 main code [0x00000000027d7440,0x00000000027d7620] = 480 stub code [0x00000000027d7620,0x00000000027d76b0] = 144 oops [0x00000000027d76b0,0x00000000027d76b8] = 8 metadata [0x00000000027d76b8,0x00000000027d76d0] = 24 scopes data [0x00000000027d76d0,0x00000000027d7730] = 96 scopes pcs [0x00000000027d7730,0x00000000027d7790] = 96 dependencies [0x00000000027d7790,0x00000000027d7798] = 8 # # If you would like to submit a bug report, please visit: # http://bugreport.java.com/bugreport/crash.jsp # Profiler Agent: JNI OnLoad Initializing... Profiler Agent: JNI OnLoad Initialized successfully Profiler Agent Warning: JVMTI classLoadHook: class name is null. Profiler Agent Warning: JVMTI classLoadHook: class name is null. Profiler Agent Warning: JVMTI classLoadHook: class name is null. Profiler Agent Warning: JVMTI classLoadHook: class name is null. Profiler Agent Warning: JVMTI classLoadHook: class name is null. Profiler Agent Warning: JVMTI classLoadHook: class name is null. Profiler Agent Warning: JVMTI classLoadHook: class name is null. Profiler Agent Warning: JVMTI classLoadHook: class name is null. Profiler Agent Warning: JVMTI classLoadHook: class name is null. Profiler Agent Warning: JVMTI classLoadHook: class name is null. Profiler Agent Warning: JVMTI classLoadHook: class name is null. 

VisualVM manages to give me a very fast snapshot (~ 60 ms), but I'm not sure how reliable such a quick test is.

I followed these instructions but didn’t change anything. I use Java7 anyway, so this is not even a problem.

This is the code I'm trying to profile:

 package pathfinderGameTest; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.Deque; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Scanner; import java.util.function.BiConsumer; import utils.Duple; public class Pathfinder<T> { //To track walls Area<T> area; public Pathfinder(Area<T> a) { area = a; } /** * Preset offsets representing each of the four directions. */ private static final List<Duple<Double>> fourDirectionOffsets = Collections.unmodifiableList(Arrays.asList( new Duple<Double>(1.0,0.0), new Duple<Double>(-1.0,0.0), new Duple<Double>(0.0,1.0), new Duple<Double>(0.0,-1.0) )); /** * Finds a path from aStart to bGoal, taking into consideration walls * * @param aStart The start position * @param bGoal The goal position * @return A list representing the path from the start to the goal */ public List<Duple<Double>> findPathFromAToB(Duple<Double> aStart, Duple<Double> bGoal) { Deque<Duple<Double>> frontier = new ArrayDeque<>(); Map<Duple<Double>, Duple<Double>> cameFrom = new HashMap<>(); frontier.push(aStart); while (!frontier.isEmpty()) { Duple<Double> current = frontier.pop(); if (current.equals(bGoal)) break; List<Duple<Double>> neighbors = cellsAround(current, fourDirectionOffsets); neighbors.stream() .filter(location -> !cameFrom.containsKey(location) && area.cellIsInBounds(location) && area.getCellAt(location) == null) .forEach( neighbor -> { frontier.add(neighbor); cameFrom.put(neighbor, current); }); } return reconstructPath(cameFrom, aStart, bGoal); } /** * Transforms a backtracking map into a path * * @param cameFrom Backtracking map * @param start Start position * @param goal Goal position * @return A list representing the path from the start to the goal */ private static List<Duple<Double>> reconstructPath(Map<Duple<Double>, Duple<Double>> cameFrom, Duple<Double> start, Duple<Double> goal) { List<Duple<Double>> path = new ArrayList<>(); //path.add(goal); Duple<Double> current = goal; do { if (current != goal) { path.add(current); } current = cameFrom.get(current); } while (current != null && !current.equals(start)); Collections.reverse(path); return path; } /** * Calculates the cells surrounding pos as indicated by the given offsets * @param pos The position to find the surrounding cells of * @param offsets Positions relative to pos to check * @return */ private static List<Duple<Double>> cellsAround(Duple<Double> pos, List<Duple<Double>> offsets) { List<Duple<Double>> surroundingCells = new ArrayList<>(); /*offsets.stream() .map( offset -> pos.map(offset, (x1, x2) -> x1 + x2) ) .forEach(surroundingCells::add);*/ for (Duple<Double> offset : offsets) { surroundingCells.add( pos.map(offset, (x1, x2) -> x1 + x2) ); } return surroundingCells; } public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("Waiting..."); s.nextLine(); List<Long> times = new ArrayList<>(); for (int tests = 0; tests < 900; tests++) { System.out.println("Starting test " + tests); long startT = new Date().getTime(); Area<Wall> a = new Area<>(500, 500); Duple<Double> source = new Duple<>(0.0, 0.0); Duple<Double> target = new Duple<>(500.0, 500.0); Pathfinder<Wall> p = new Pathfinder<>(a); List<Duple<Double>> path = p.findPathFromAToB(source, target); times.add( (new Date().getTime()) - startT ); } System.out.println("\n\n"); long sum = 0; for (long t : times) { System.out.println(t); sum += t; } System.out.println("Average: " + ((double)sum / times.size() / 1000) + " seconds."); } } 
+5
source share

Source: https://habr.com/ru/post/1235208/


All Articles