如果你得到一个过程,如堆栈转储,通过jstack,你会得到关于锁定的监视器(和同步),一个地址为每个信息.例如,从一个简单的死锁双线程进程(使用jstack):
"Thread-0" prio=10 tid=0x00007f1444042000 nid=0x2818 waiting for monitor entry [0x00007f14433ca000]
java.lang.Thread.State: BLOCKED (on object monitor)
at scrap.DeadlockTest$Deadlocker.run(DeadlockTest.java:49)
- waiting to lock <0x00000007c14e6378> (a java.lang.Object)
- locked <0x00000007c14e6368> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:619)
... (omitted some lines here)
Java stack information for the threads listed above:
===================================================
"Thread-1":
at scrap.DeadlockTest$Deadlocker.run(DeadlockTest.java:49)
- waiting to lock <0x00000007c14e6368> (a java.lang.Object)
- locked <0x00000007c14e6378> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:619)
"Thread-0":
at scrap.DeadlockTest$Deadlocker.run(DeadlockTest.java:49)
- waiting to lock <0x00000007c14e6378> (a java.lang.Object)
- locked <0x00000007c14e6368> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:619)
Run Code Online (Sandbox Code Playgroud)
有没有什么办法让,在Java代码运行时,上面显示的地址相同,如 …
我在一个小的microbenchmark应用程序(运行JDK 1.6)中有以下两种方法:
public static String testStringBuilder3(String str1, String str2, String str3, String str4, String str5) {
return new StringBuilder(str1).append("-").append(str2).append("-").append(str3).append("-").append(str4).append("-").append(str5).toString();
}
public static String testStringBuilder4(String str1, String str2, String str3, String str4, String str5) {
return str1 + "-" + str2 + "-" + str3 + "-" + str4 + "-" + str5;
}
Run Code Online (Sandbox Code Playgroud)
我希望这两种方法的字节码是相同的.它们几乎完全相同,只有一点我不想理解.
这是第一种方法的字节码(我不能让StackOverflow正确格式化):
public static java.lang.String testStringBuilder3(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
Code:
0: new #164; //class java/lang/StringBuilder
3: dup
4: aload_0
5: invokespecial #170; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
8: ldc …Run Code Online (Sandbox Code Playgroud) 我有这个基本程序,除了坐在那里等待输入之外什么都不做:
import java.io.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Basic {
public static void main(String[] args) throws Exception{
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input;
input=br.readLine();
}catch(IOException io){
io.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个:
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15001 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false Basic
Run Code Online (Sandbox Code Playgroud)
我通过JConsole连接看到这个:

这只是因为核心java bytcode最初被编译?当进程没有做任何事情时,如何增加codecache?
当我有这个版本(使用Thread.sleep):
public class Basic {
public static void main(String[] args) throws Exception{
while(true) {
Thread.sleep(5000);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我明白了:

那么......为什么会这样呢?
PS这是输出java -version:
java version "1.6.0_37"
Java(TM) SE Runtime Environment …Run Code Online (Sandbox Code Playgroud) 我最近阅读了Jeremy Manson(谷歌)的一篇博客文章,内容是关于如何使用更准确,更轻量级的异步采样分析器.它依赖于热点JVM中的"AsyncGetCallTrace"未记录方法来收集线程的堆栈跟踪.
http://jeremymanson.blogspot.fr/2013/07/lightweight-asynchronous-sampling.html
我对JProfiler社区的问题是:JProfiler在其当前的7.2.3版本中是否可以使用AsyncGetCallTrace?这个功能是否适用于JProfiler 8.0?
在HTOP中,您可以看到RES值(驻留大小),它显示了您的JVM进程实际占用的RAM量.
现在我想通过仅使用纯Java来获得该值.如果你告诉我这是不可能的,那也没关系.
让我解释一下我用htop显示RES值为887M的应用程序所做的所有尝试:
任何想法我还能尝试什么?
我使用以下JVM参数来启动主机调试程序的JVM.
-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0
Run Code Online (Sandbox Code Playgroud)
请注意,我正在分配端口零,以便JVM向操作系统请求临时端口.这对我的用例至关重要,以确保JVM不会因为某些预定义端口的争用而无法启动.
结果我的JVM启动,并将以下日志条目输出到stdout:
Listening for transport dt_socket at address: XXXX
Run Code Online (Sandbox Code Playgroud)
我想找到一些方法来识别JVM内部或外部的调试端口,因此我可以将它记录在状态管理服务器中.
这个用例有哪些选择?我已经考虑了以下几点,但没什么乐趣:
我尝试用JMH创建基准测试,我发现所有教程都参考了@GenerateMicroBenchmark.
但我无法在jmh-core中找到它:1.11.3.
如果它被删除了,它的替代品是什么,以及在没有该注释的情况下创建基准测试的惯用方法是什么.
我在那里看到对预先分配的JVM异常的引用: - http://www.oracle.com/technetwork/java/javase/relnotes-139183.html - http://dev.clojure.org/display/community/Project+创意+ 2016
但寻找我只看到有关丢失堆栈跟踪的信息.什么是JVM分配的异常?这似乎是一种优化.
它是如何工作的,它有什么权衡取舍?
甲骨文表示在Windows上
-Xsssize缺省值取决于虚拟内存
如何在给定的Oracle JVM 8中找出Java在Windows上分配的线程堆栈大小的值?
我已尝试从哪里找到Sun / Oracle JVM的默认XSS值的解决方案?
但它只打印0。
java -XX:+PrintFlagsFinal -version
Run Code Online (Sandbox Code Playgroud)
java -XX:+PrintFlagsFinal 应该打印实际的线程堆栈大小,而不是0。对我来说似乎是JVM bug。
我想调整JVM性能,并想知道为线程的堆栈分配了多少内存。它是为unix平台专门指定的。我无法为Windows获得此值,这很奇怪。
OutOfMemoryError当堆没有足够的内存来创建新对象时,就会发生这种情况.如果堆没有足够的内存,则OutOfMemoryError创建对象的位置.我想了解这一点,请指教.
jvm-hotspot ×10
java ×9
jvm ×5
performance ×2
bytecode ×1
code-caching ×1
concurrency ×1
debugging ×1
jmh ×1
jprofiler ×1
memory ×1
stack-trace ×1