草庐IT

thread-dump

全部标签

java - 有没有办法使用 JVMTI 生成定期的 java 线程转储?

在java中有多种生成线程转储的方法。我想使用JVMTI(CAPI)来生成它,以评估它对正在运行的JVM的性能影响。(我知道jstack和JMX;这个问题通常不是关于获取线程转储,而是关于使用JVMTIAPI)。我的代码基于thisblogpost.在那里,java代理附加到SIGQUIT信号。我想避免这种情况,因为这与JVM用于将线程转储写入标准输出的信号相同。我想避免这种口是心非。换句话说,我想附加到不同的信号,或者找到一种方法让代理定期生成线程转储。 最佳答案 Inthere,thejavaagentattachestothe

java - 同步 : Threads execute two critical sections in same order

我有以下类型的代码:synchronizedblock1{//onlyonethreadintheblock}{lotofcodewheresynchronizationnotnecessary}synchronizedblock2{//onlyonethreadintheblock.//Allthethreadsthatexecutedblock1beforethisthreadshouldhavealreadyexecutedthisblock.}每个线程首先以相同的顺序执行block1、非同步块(synchronizedblock)和block2。如果线程T1在线程T2之前执行b

java - Thread.isInterrupted 不起作用,Thread.interrupted 起作用

下面的程序演示了这个问题(最新的JVM等等):publicstaticvoidmain(String[]args)throwsInterruptedException{//ifthisistrue,bothinterruptedandisInterruptedworkfinalbooleanwithPrint=false;//decidewhethertouseisInterruptedorinterrupted.//ifthisistrue,theprogramneverterminates.finalbooleanuseIsInterrupted=true;ExecutorServ

java - Thread::yield 与 Thread::onSpinWait

好吧,标题基本上说明了一切,还有一点我真的很想知道什么时候使用它们。它可能很简单——我已经阅读了它们的文档,但仍然看不出它们的区别。有像this这样的答案这里基本上说:Yieldingalsowasusefulforbusywaiting...我不太同意他们的观点,原因很简单,ForkJoinPool在内部使用了Thread::yield,这是jdk世界中最近才添加的。真正困扰我的是在jdk中也有这样的用法(StampledLock::tryDecReaderOverflow):elseif((LockSupport.nextSecondarySeed()&OVERFLOW_YIELD

java - java.lang.Thread 中新增的附加字段,是什么意思?

在Java8中,java.lang.Thread类获得了3个新字段:/**ThecurrentseedforaThreadLocalRandom*/@sun.misc.Contended("tlr")longthreadLocalRandomSeed;/**Probehashvalue;nonzeroifthreadLocalRandomSeedinitialized*/@sun.misc.Contended("tlr")intthreadLocalRandomProbe;/**SecondaryseedisolatedfrompublicThreadLocalRandomsequen

java - 在 Java 中从 main() 中的 Thread 实例上运行 wait()

我正在研究java.lang.Object中wait()的定时版本,并观察到它在两种不同情况下的行为不同。场景一:在Thread中使用run()的默认定义publicstaticvoidmain(String[]args)throwsInterruptedException{Threadt=newThread();t.start();System.out.print("X");synchronized(t){t.wait(10000);}System.out.print("Y");}关于场景1的问题:我在X和Y之间遇到延迟。这是因为我从main调用wait()(即使在t上),因此调用m

Java 线程转储汇总工具

有时我不得不查看来自Tomcat服务器的线程转储。但是,这是一个非常缓慢的过程,因为我的应用程序使用具有几百个线程的线程池。我查看的大多数线程转储都包含许多线程的相同堆栈跟踪,因为它们处于空闲状态等待工作。是否有任何工具可以解析线程转储并仅向我显示唯一的堆栈跟踪以及每个状态中线程数的计数?这将使我能够快速忽略在公共(public)位置等待工作的数十或数百个线程。我试过ThreadDumpAnalyzer但这不会对常见堆栈跟踪进行任何总结。 最佳答案 我已经编写了一个工具来完成我想做的事情。JavaThreadDumpAnalysis

java - 如果 Thread.sleep 是静态的,单个线程如何知道它已进入休眠状态?

我对Thread.sleep()方法有点困惑。如果Thread.sleep()是静态方法,两个线程如何知道哪个线程进入休眠状态。例如,在下面的代码中,我有两个三个Threadsmain、t和t1。我总是调用Thread.sleep()。不是t.sleep()。这是否意味着Thread.sleep()使当前线程进入休眠状态?这意味着Thread实例通过调用静态方法自行进入休眠状态。如果t1想让t进入休眠状态怎么办?这不可能是正确的?publicclassThreadInterrupt{publicstaticvoidmain(String[]args)throwsInterruptedE

java - RxJava : Observable and default thread

我有以下代码:Observable.create(newObservableOnSubscribe(){@Overridepublicvoidsubscribe(@NonNullfinalObservableEmitters)throwsException{Threadthread=newThread(newRunnable(){@Overridepublicvoidrun(){s.onNext("1");s.onComplete();}});thread.setName("background-thread-1");thread.start();}}).map(newFunction

java - 仅本地图值不存在时才创建并放置一个 map 值,并获取它 : thread-safe implementation

使此代码段线程安全的最佳方法是什么?privatestaticfinalMapMAP=newHashMap();publicstaticBputIfNeededAndGet(Akey){Bvalue=MAP.get(key);if(value==null){value=buildB(...);MAP.put(key,value);}returnvalue;}privatestaticBbuildB(...){//business,canbequitelong}以下是我能想到的几个解决方案:我可以使用ConcurrentHashMap,但如果我很好理解,它只是使原子put和get操作线程