小编Mar*_*ger的帖子

60
推荐指数
4
解决办法
7万
查看次数

究竟什么-XX:-TieredCompilation呢?

使用java -XX:+PrintFlagsFinal我找到了TieredCompilation旗帜,我在线阅读了一下.

然而,我仍然不知道究竟它设置时会发生什么false.

我知道编译系统支持5个执行级别,基本上分为解释器C1和C2:

  • 0级 - 翻译
  • 级别1 - 具有完全优化的C1(无分析)
  • 级别2 - 具有调用和后备计数器的C1
  • 3级 - 具有完整性能分析的C1(2级+ MDO)
  • 4级 - C2

资料来源:http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/2b2511bd3cc8/src/share/vm/runtime/advancedThresholdPolicy.hpp#l34

两个问题:

(1)通过设置-XX:-TieredCompilation,这些级别中的一些只是禁用了吗?如果是的话,哪个?

(2)是否有一些标志来决定是禁用C1还是C2,还是根本不编译?

java jit jvm

54
推荐指数
3
解决办法
2万
查看次数

尝试使用GTKLookAndFeel冻结应用程序在JavaFX中设置样式的SwingNodes

我们有一个使用Swing的Java应用程序,但我们正在将它迁移到JavaFX.因此,我们将旧的Swing代码包装成SwingNodes并逐步替换它们.

在迁移之前,Swing应用程序用作com.sun.java.swing.plaf.gtk.GTKLookAndFeel外观(Ubuntu上的默认设置).我们使用以下代码进行设置(如果可用):

for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
  if (info.getClassName().equals("com.sun.java.swing.plaf.gtk.GTKLookAndFeel")) {
    UIManager.setLookAndFeel(info.getClassName());
  }
}
Run Code Online (Sandbox Code Playgroud)

这很好.然而,在切换到JavaFX后,调用UIManager.setLookAndFeel()冻结应用程序,没有任何反应.需要手动设置外观,因为我们仍然需要设置尚未根据文件迁移到JavaFX的Swing组件的样式GTKLookAndFeel.

进一步的信息:这只是不起作用com.sun.java.swing.plaf.gtk.GTKLookAndFeel,因为它在使用时起作用javax.swing.plaf.metal.MetalLookAndFeel,javax.swing.plaf.nimbus.NimbusLookAndFeelcom.sun.java.swing.plaf.motif.MotifLookAndFeel.

我们可以做些什么来使用它GTKLookAndFeel来设计我们的Swing组件SwingNode

java gtk swing javafx look-and-feel

47
推荐指数
1
解决办法
881
查看次数

JVM如何决定JIT编译方法(将方法归类为"热门")?

我已经使用过-XX:+PrintCompilation,我知道JIT编译器的基本技术以及使用JIT编译的原因.

然而,我仍然没有发现JVM如何决定JIT编译方法,即"正确的时间来到JIT编译方法".

我是否正确地假设每个方法都开始被解释,并且只要它不被归类为"热方法"它就不会被编译?我有一些东西在脑后,我读到一个方法被认为是"热",当它执行至少10.000次(解释方法10.000次后,它将被编译),但我不得不承认我是不确定这个或我在哪里读到这个.

总结一下我的问题:

(1)只要没有将每种方法归类为"热"方法(并因此已被编译),或者即使它们不是"热门",也有理由编制方法?

(2)JVM如何将方法分为"非热"和"热"方法?执行次数?还要别的吗?

(3)如果"热"方法存在某些阈值(如执行次数),是否有Java标志(-XX:...)来设置此阈值?

java jit jvm jvm-hotspot

30
推荐指数
2
解决办法
5887
查看次数

String.getOrElse() 和 String.elementAtOrElse() 之间有什么区别?

正如标题所说:

String.getOrElse()和之间有什么区别吗String.elementAtOrElse()?从功能的角度来看,它们看起来完全相同,也许有一些性能差异?

同样的问题涉及String.getOrNull()String.elementAtOrNull()

kotlin

21
推荐指数
2
解决办法
1791
查看次数

如何设置菜单按钮和菜单项的样式

我试图在菜单按钮中更改样式.我可以更改菜单按钮样式,但不能更改其菜单项.无论我尝试菜单按钮内的菜单项保持不变.

.menu-button {
 -fx-background-color:black;
}

.menu-button .label {
 -fx-background-color:black; }
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样

现在我怎么能改变遗漏的颜色?

css javafx menuitem javafx-2 javafx-8

17
推荐指数
2
解决办法
3万
查看次数

是否可以在Java 9中注释lambda表达式?

这个问题现在已经超过3年了,并且专门针对Java 8,接受的答案也引用了Java SE 8最终规范.

如果在Java 9中有关于这个问题的内容会发生变化,我会感兴趣:有没有办法注释类似于注释相应匿名类的lambda表达式?


例:

注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface MyTypeAnnotation {
    public String value();
}
Run Code Online (Sandbox Code Playgroud)

匿名类的工作注释:

Consumer<String> consumer = new @MyTypeAnnotation("Hello ") Consumer<String>() {
    @Override
    public void accept(String str) {
        System.out.println(str);
    }
};
Run Code Online (Sandbox Code Playgroud)

注释lamba表达式,目前在Java 8中不起作用:

Consumer<String> myAnnotatedConsumer = @MyTypeAnnotation("Hello") (p -> System.out.println(p));
Run Code Online (Sandbox Code Playgroud)

java lambda annotations java-9

17
推荐指数
3
解决办法
1319
查看次数

Gnuplot:忽略数据文件中第一行的最短方法

我有一个.csv数据文件由另一个第三方应用程序创建,应该使用gnuplot.我们假设该文件具有以下格式:

1;2;3;4;5;6 <-- This is the header line that should be ignored (with values 1;2;...;N)
1;1;2;1;1;1
2;3;3;3;5;6
3;4;1;1;1;4
Run Code Online (Sandbox Code Playgroud)

第一列是x轴,下面的列应该各自绘制为自己的线图(是的,我知道,一个图中的太多线图可​​能看起来很糟糕,但只是为了得到一个想法).这是一个MCVE:

set terminal png size 1000,500    
set datafile separator ";" # CSV file is seperated with ;
plot \
  'C://tmp/test.csv' using 1:2 with lines title "A",\
  'C://tmp/test.csv' using 1:3 with lines title "B",\
  'C://tmp/test.csv' using 1:4 with lines title "C",\
  'C://tmp/test.csv' using 1:5 with lines title "D",\
  'C://tmp/test.csv' using 1:6 with lines title "E"
Run Code Online (Sandbox Code Playgroud)

问题是,这也是第一行,因为它将是数据.

我知道可以通过启动它来忽略数据文件中的任何行#,比如#1;2;3;4;5;6,但我不想编辑该文件,因为它也被其他工具使用. …

plot gnuplot

16
推荐指数
2
解决办法
3万
查看次数

究竟什么被认为是垃圾收集根以及它们如何在HotSpot JVM中找到?

介绍:

在大学里,人们了解到Java(和类似语言)中的典型垃圾收集根是加载类的静态变量,当前运行线程的线程局部变量,"外部引用"(如JNI句柄)和GC特定(如old-to) -在世代垃圾收集器的Minor GCs期间的年轻指针.从理论上讲,这听起来并不难.


问题:

我读的热点的源代码和感兴趣的是如何在VM内检测到这些垃圾收集根,即,该方法是使用内部的JVM源代码访问所有的根源.


调查:

我发现psMarkSweep.cpp属于各种GC实现的各种文件(例如)包含非常相似的结构.

以下是我认为涵盖强大根源的方法PSMarkSweep::mark_sweep_phase1方法psMarkSweep.cpp:

ParallelScavengeHeap::ParStrongRootsScope psrs;    
Universe::oops_do(mark_and_push_closure());    
JNIHandles::oops_do(mark_and_push_closure());   // Global (strong) JNI handles    
CLDToOopClosure mark_and_push_from_cld(mark_and_push_closure());
MarkingCodeBlobClosure each_active_code_blob(mark_and_push_closure(), !CodeBlobToOopClosure::FixRelocations);    
Threads::oops_do(mark_and_push_closure(), &mark_and_push_from_cld, &each_active_code_blob);    
ObjectSynchronizer::oops_do(mark_and_push_closure());    
FlatProfiler::oops_do(mark_and_push_closure());    
Management::oops_do(mark_and_push_closure());    
JvmtiExport::oops_do(mark_and_push_closure());    
SystemDictionary::always_strong_oops_do(mark_and_push_closure());    
ClassLoaderDataGraph::always_strong_cld_do(follow_cld_closure());    
// Do not treat nmethods as strong roots for mark/sweep, since we can unload them. 
//CodeCache::scavenge_root_nmethods_do(CodeBlobToOopClosure(mark_and_push_closure()));    
Run Code Online (Sandbox Code Playgroud)

以下代码psScavenge.cpp似乎为不同类型的GC根添加任务:

if (!old_gen->object_space()->is_empty()) {
  // There are only old-to-young pointers …
Run Code Online (Sandbox Code Playgroud)

java garbage-collection jvm heap-memory jvm-hotspot

16
推荐指数
1
解决办法
679
查看次数

Java G1:监视生产中的内存泄漏

多年来,我们一直在运行具有适度堆大小的Java服务+UseParallelOldGC.现在,我们开始使用更大的堆和G1收集器推出新服务.这很顺利.

对于我们使用的服务+UseParallelOldGC,我们通过查看收集后的旧代大小并在阈值上发出警报来监视内存泄漏.这很有效,事实上两周前我们的培根就已经存了.

具体而言,+UseParallelOldGC我们执行以下操作:

  • ManagementFactory.getMemoryPoolMXBeans()
  • 搜索MemoryPoolMXBean名称以结尾的结果"Old Gen"
  • 比较getCollectionUsage().getUsed()(如果有)getMax()

不幸的是,似乎G1不再具有这样的概念getCollectionUsage().

但是,从根本上说,我们希望在混合循环中选择的最后一个混合集合之后监视G1堆大小,或类似的东西.

例如,在VM之外我会对awk脚本感到满意,该脚本只发现了最后一个脚本,'(mixed)'然后'(young)'查看了最终的堆大小(例如'1540.0M' 'Heap: 3694.5M(9216.0M)->1540.0M(9216.0M)')

在Java VM中有没有办法做到这一点?

java garbage-collection g1gc

15
推荐指数
1
解决办法
1245
查看次数