For Java you can do better than perf. Sun's Performance Analyzer [1] has had hardware counter based profiling of real Java (not just JIT-compiled code) for more than 10 years. Open source async profiler [2] seems to be doing a decent job on the data collection side, though, doesn't go beyond a basic flame graph for analysis.
[1] https://en.wikipedia.org/wiki/Performance_Analyzer [2] https://github.com/jvm-profiling-tools/async-profiler