Tag: jvm

java代码执行在没有断点和正常运行的调试中产生不同的结果。 ExecutorService坏了吗?

TL:DR ExecutorService executorService = Executors.newFixedThreadPool(8); 在debug中运行并发,但在正常运行时它启动并发,但后来在单线程中运行。 我有一些代码,我在ExecutorService启动了4个不同的任务。 其中两个任务应该几乎立即完成,另外两个应该运行一段时间。 这些任务在Future以秒为单位返回执行时间。 此代码负责任务执行和测量: public Future measure(int[] arr, ProcessIntArray processIntArray, ExecutorService es) { Callable task = () -> { long start = System.nanoTime(); processIntArray.process(arr); long end = System.nanoTime(); return (end – start) / 1000000000.0; }; return es.submit(task); } 稍后,在启动这些任务后,我将按照先前运行的执行时间顺序打印相同的输入大小。 Future bubbleSortTime = measure(bubbleSortArray, Solution::bubbleSort, executorService); Future insertionSortTime = measure(insertionSortArray, […]

如果JIT正在执行到机器指令的字节码转换,那么JVM的用途是什么

我真的很难理解以下事情 以前我知道: 编译Java程序时,将生成.class文件。 在那个代码是以字节的forms。 然后JVM将该字节代码转换为机器可理解的格式。 现在我在SO中的一个问题中看到了 Just-In-Time(JIT)编译器是运行时解释器的一个特性,它不是在每次调用方法时解释字节码,而是将字节码编译成运行机器的机器代码指令。 所以这里JIT将字节码转换为机器指令。 那么JVM的用途是什么。 我们可以用JIT做到这一点。 据我所知,JIT仅用于提高JVM的性能。

Javamultithreading程序如何使用多个CPU内核?

有人可以解释一下,当JVM只是linux上的单个进程时,Javamultithreading程序(例如Tomcat servlet容器)如何能够使用所有CPU内核? 是否有任何好的深入文章详细描述了这个主题? 编辑#1 :我不是在寻找如何在Java中实现multithreading程序的建议。 我正在寻找JVM内部如何在linux / windows上使用多个内核同时仍在操作系统上进行单一处理的解释。 编辑#2 :我设法找到的最佳解释是Hotspot(Sun / Oracle JVM)使用NPTL在Linux上将线程实现为本机线程。 因此,Java中的每个线程都是Linux上的轻量级进程(本机线程)。 使用ps -eLf命令可以清楚地看到,打印输出不仅包括进程ID( PPID ),还包括本机线程ID( LWP )。 更多细节也可以在这里找到: http://www.velocityreviews.com/forums/t499841-java-5-threads-in-linux.html 区分Java线程和OS线程? 编辑#3 :维基百科在NPTL上有简短但很好的条目,还有一些参考文献http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library

命名(toString)Lambda-Expressions以进行调试

有时命名lambdas是有用的。 特别是当你将它们作为参数传递时。 一个非常简单的例子是 public class Main { public static void main(String[] args) { Predicate p = nameIt(“isNotEmpty”, (s) -> !s.trim().isEmpty()); maybePrint(“Hello”, p); maybePrint(” “, p); } static void maybePrint(T s, Predicate pred) { if (pred.test(s)) { System.out.println(s.toString()); } else { System.err.println(pred + ” says no to \”” + s + “\””); } } } jvm有一些function可以命名lambdas而不会失去幕后的优秀性能优化。 […]

JVM检查入口方法main(String args )的返回类型是否为空而不是其他任何内容的原因和原因?

我会尽力回答这两个问题,如果我错了,请纠正我: 其中:如果使用Classname .method()或使用reflection调用静态方法,则即使更改调用方法的返回类型也无关紧要,仍将调用相同的方法。 因此JVM可能会在jvm.cpp的一个本机方法中检查它 methodHandle m(THREAD,init_klass-> find_method(vmSymbols :: object_initializer_name(),> vmSymbols :: void_method_signature() )); if(m.is_null()){—— THROW_MSG_0 ……… .. 原因:虽然从main返回一个值是没用的,因为java不对它做任何事情,但是如果我们尝试将main的返回类型更改为int,例如,JVM抛出 public static int main(String [] args){return 1; } java.lang.NoSuchMethodError:线程“main”中的主要exception 因此,Java可能要求对入口方法main()使用相同的签名来保持所有Java程序的对称性 。

NewRatio参数不与CMS垃圾收集器一起使用

我为我的应用程序切换到CMS收集器,应用程序的吞吐量减少了一半。 从GC日志中,我发现很少发生轻微的GC(每秒10 per second )。 我已经分配了4G的堆大小。 默认情况下,JVM使用非常小的尺寸(小于40MB )。 我想通过增加年轻人的规模来尝试CMS。 你能指点我正确的JVM参数吗? 我尝试了-XX:NewRatio但是JVM忽略了这个参数,并且年轻的gen大小没有变化 我的java版本是java version “1.6.0_14”

Tomcat:调整内存比例

我有一个运行在Windows 2008 Server上的Tomcat实例,内存为4GB。 服务器专用于这一个应用程序,所以我非常希望能够将大部分RAM专用于Tomcat。 我的Tomcat设置目前有以下java选项: -Xms256m -Xmx1600m 我想增加RAM的数量,最好是大约3GB(显然我知道怎么做,只需增加-Xmx值)。 但是,如果我将最大堆空间增加到1600MB以上,Tomcat就会拒绝启动。 我读过的几个网站都说Tomcat不能使用超过40%的可用RAM,这看起来与我所看到的一致。 有没有办法增加Tomcat可以使用的内存比例 ,这样我可以增加Tomcat可以使用的内存量 ? 谢谢,Rik

WEEK_OF_YEAR在不同的机器上不一致

更新:好的,我似乎找到了答案的一半。 如果我使用无参数getInstance创建我的日历,我得到WEEK_OF_YEAR = 52.但是,如果我通过向getInstance提供Local.getDefaul()创建它,我得到WEEK_OF_YEAR = 1.完全没想到这个…我想,需要重新阅读日历文档。 从时间戳构建日历,对应于星期六,2011年1月1日00:00:00 GMT 。 使用java.util.Date,Calendar和TimeZone的相同代码在不同的机器上具有不同的行为(具有相同的区域设置); 除了WEEK_OF_YEAR之外,日历中的所有字段都是相同的。 在我的机器上它是52(实际上在我的两台机器上)。 在我的同事的机器上它是1(这似乎是正确的)。 import java.util.Date; import java.util.TimeZone; import java.util.Calendar; import java.util.Locale; public class CalendarTest { public static void main(String[] args) { Locale l = Locale.getDefault(); System.out.println(l); Long d = new Long(1293840000000l); Calendar c = Calendar.getInstance(); c.setTimeZone(TimeZone.getTimeZone(“UTC”)); c.setTime(new Date(d)); System.out.println(c.toString()); } .. locale是en_US,但Calendar是: >java.util.GregorianCalendar[time=1293840000000, areFieldsSet=true, areAllFieldsSet=true, […]

重新启动具有更大堆空间的JVM

我希望能够执行.Jar文件,如果堆空间设置得不够大,它应该启动一个具有相同.Jar文件的新JVM,但设置更大的堆空间,然后关闭第一个JVM和.Jar。 我尝试过使用ProcessBuilder,但我无法使用它。 它必须跨平台工作。 -ONi

如果终结器使对象可达,该怎么办?

在Java中,当一个对象(它会覆盖它)时会调用finalize ,当它即将被垃圾回收时,所以当它无法访问时。 但是如果终结器使对象再次可达,那么会发生什么呢?