Tag: jvm

为什么强制垃圾收集会增加分配给java进程的内存?

所以我有这个代码: public static void main(String[] args) throws Exception { Thread.sleep(5000); System.out.println(“Creating array…”); Integer[] integers = new Integer[Integer.MAX_VALUE/32]; Thread.sleep(5000); System.out.println(“Destroying array”); integers = null; //System.gc (); //System.runFinalization (); Thread.sleep(60000); } 当我运行这段代码后,我会在大约5秒钟后看到268 MB的ram被分配给Activity Monitor中的java进程。 当我在控制台中看到“销毁arrays”后取消注释注释行(System.gc和以下行)时,分配的内存增加到278 MB。 我可以理解内存没有被释放,因为System.gc()只是对JVM的一个暗示,但为什么10MB会增加呢? 此时加载到内存中的是什么?

动态类重新加载仅在调试模式下工作,为什么/如何真正起作用?

我有一个棘手的问题。 我的java程序正在循环这样的事情: 环: 将已编译的java类的外部文件读入byte []数组。 创建我自己的类加载器的新实例。 从readed文件到classloader的这个实例的setbytes。 使用创建的类加载器从外部文件创建类的对象的新实例。 调用所创建对象的任何方法。 问题出在哪里。 当我在调试模式下运行此程序时,它的行为与我期望的一样,因此如果外部文件更改了类加载器,则加载新版本的类并执行新版本(如果文件未更改,则当然也加载旧版本)。 但是当我运行这个程序时,不是在调试模式下,它总是执行旧版本,尽管readed文件已经改变。 也许对类加载问题和JVM行为有更深入了解的人可以向我解释这种行为。

如何减少jvm使用的线程数

我在以下java版本上运行单线程Java应用程序: java version “1.7.0_67” Java(TM) SE Runtime Environment (build 1.7.0_67-b01) Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode) 启用-XX:+UseSerialGC选项。 当我启动应用程序时,我看到多个线程在使用htop监视系统时启动。 我想尽可能减少启动的进程数,因为我有一个用例涉及运行此应用程序的多个实例,这将触及我正在运行的系统上允许的最大进程数量的上限上。 除了-XX:+UseSerialGC之外是否还有其他jvm选项-XX:+UseSerialGC我可以用来减少线程数量的开始?

使用ConcMarkSweepGC的连续CMS集合

在Linux上使用以下JVM选项启动Tomcat(2cpu,4g RAM,800M ehcache元素): -Xmn512m -Xmx2g -Xms2g -XX:+UseConcMarkSweepGC -Xss128k -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+DisableExplicitGC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails 运行流量低,没有数据库问题,没有批处理过程在凌晨(06:00)20分钟之前, 堆内存达到-Xmx值并且CMS反复运行 ,最终返回到正常的GC行为,此时消息Unloading class sun.reflect.GeneratedMethodAccessorXXXXX已打印到日志中。 请你能: 建议一些GC调整点? 要么 建议可能的原因? GC日志: 2011-06-30T06:15:03.494+0900: 145634.229: [GC 145634.230: [ParNew: 463698K->37791K(471872K), 0.0342030 secs] 1848117K->1434326K(2044736K), 0.0343190 secs] [Times: user=0.13 sys=0.01, real=0.03 secs] 2011-06-30T06:15:12.423+0900: 145643.159: [GC 145643.159: [ParNew: 457247K->36210K(471872K), 0.0302130 secs] 1853782K->1443540K(2044736K), 0.0303470 secs] [Times: user=0.12 sys=0.00, real=0.03 secs] […]

识别Java jdwp Debugger Assigned(Ephemeral)端口

我使用以下JVM参数来启动主机调试程序的JVM。 -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0 请注意,我正在分配端口0,以便JVM向操作系统请求临时端口。 这对我的用例至关重要,以确保JVM不会因为某些预定义端口的争用而无法启动。 结果我的JVM启动,并将以下日志条目输出到stdout : Listening for transport dt_socket at address: XXXX 我想找到一些方法来识别JVM内部或外部的调试端口,因此我可以将它记录在状态管理服务器中。 这个用例有哪些选项? 我已经考虑了以下几点,但没什么乐趣: JMX Connector – 使用JConsole连接到进程,找到一些详细说明使用哪个端口的MBean。 但是,我找不到任何这样的MBean RMI注册表 – 是否可以让调试代理自己注册RMI注册表? 我没有发现任何可行的证据。 Java代理 – 指定可以拦截调试器某些方面并获取端口详细信息的JVM代理,再次没有证据支持这种想法的可行性。

为什么没有ICMP指令?

正如你们中的一些人可能知道的那样,我们有大量的操作码来比较不同类型的原始值: LCMP FCMPL FCMPG DCMPL DCMPG IFEQ IFNE IFLT IFGE IFGT IFLE IF_ICMPEQ IF_ICMPNE IF_ICMPLT IF_ICMPGE IF_ICMPGT IF_ICMPLE IF_ACMPEQ IF_ACMPNE … 由于显而易见的原因,指令集的创建者并没有费心添加所有IF_LCMPEQ , IF_FCMPLT ,……指令,但我想知道为什么没有ICMP指令,看到它对于布尔值或Integer.compare(int, int)非常有用Integer.compare(int, int) 。

用Java替换默认的DNS名称解析

我想改变JVM在HttpURLConnections中解析域名的方式。 我没有通过默认的TCP / IP堆栈访问DNS服务器,而是想编写自己的代码来解析域名。 有没有办法替换默认的名称解析机制?

从Java 6 + Tomcat 6升级到Java 8 + Tomcat 8时的垃圾收集器使用情况

我们正在从Java 6和Tomcat 6升级到Java 1.8.0_45和Tomcat 8.0.23,Linux服务器,64位。 我正在比较内存使用情况,而我正面临一种奇怪的行为。 这就是Eden Space在Tomcat 8中使用Java 8的方式,没有流量,只是启动和空闲: 这就是Java 6的标准,对我来说是标准的: 两个JVM的配置方式基本相同,基本上: XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+DisableExplicitGC -Xms768m -Xmx2048m -Xmn400m 使用Java 8和Tomcat 8,小型GC几乎总是在运行,而tomcat日志显示如下: 1301,121: [GC (Allocation Failure) [PSYoungGen: 408960K->352K(409088K)] 1126151K->717559K(1915392K), 0,0093033 secs] [Times: user=0,02 sys=0,00, real=0,01 secs] 您是否知道JVM 8的一些特殊配置或我必须做的事情才能拥有与之前相同的行为? 编辑: 30分钟后,伊甸园空间是:

JIT / Hotspot技术书

有没有人知道任何有关各种JVM或其他虚拟机环境(python / ruby​​ ……)正在使用的JIT技术或热点技术的好书或长篇网页文章(或研究文章?) 看起来这将是一个非常有趣的阅读imho(虽然有关细节的东西很难在互联网上找到……)

在运行时更改JVM JIT选项

是否可以在运行时更改Java JVM(JIT)的选项和/或模式? 例如,更改XX:CompileThreshold,甚至在解释和编译的代码之间切换( -Xcomp vs -Xint )。 我的JVM来自OpenJDK(1.6),Hotspot或Zero / Shark