Articles of jvm

SocketInputStream.socketRead0()中CPU占用率高的原因

在分析本土networking应用程序的时候,我发现下面非常奇怪(至less对我来说)是观察的。 几乎所有的时间都花在SocketInputStream类的socketRead0()方法中。 这并不奇怪,因为我的应用程序在每个请求上都与远程服务联网。 奇怪的是,这种方法不仅壁挂时钟使用率高, CPU时钟时间也很高。 我不明白为什么CPU时间很长,因为如果我的应用程序等待远程服务来回复(实际上这不是很快),那么应用程序本身就没有什么可做的了。 所以CPU时间应该显然很低。 还有一些观察: 在采样模式下的VisualVM显示,方法SocketInputStream.socketRead0()正在消耗高达95%的时间(挂钟时间和 CPU时间); mpstat (我们使用Linux作为操作系统)显示约90%的用户时间和约1-3%的系统时间(其余为空闲时间); 应用程序部署在专用服务器上; 远程服务也是HTTP Web应用程序。 平均响应时间约为100ms。 平均响应大小约为2Kb。 我的应用程序使用spring RestTemplate与远程服务交互,而不是直接与SocketInputStream交互。 现在我只有一个想法 – 也许这是在JVM中调用本地方法的开销( SocketInputStream.socketRead0()是本地的)? 你怎么看? 有没有其他的原因呢?

在Linux中运行时如何在Java中创build符号链接?

在Linux中运行时如何在Java / JVM中创build符号链接? 除了使用Java本地接口(JNI)或者java.lang.Runtime.exec("/bin/ln -s /some/path symlink")什么方法吗? 创build一个符号链接是非常依赖于平台的,但是我主要关心在Linux上运行,如果在Windows中创build一个快捷方式,那么奖励就会很大。

无法创buildJava虚拟机

面临一些与Java虚拟机初始化的问题。 当我使用root帐户时,我可以正常使用java。 但是当我是一个用户帐户,它返回以下错误 user@host# $JAVA_HOME/bin/java -version Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine. 它不像一个内存问题,因为相同的命令适用于root帐户。 可用内存(免费-m)超过1200MB另外我已经尝试增加JVM内存限制

smap中的“Private_Dirty”记忆是什么意思?

我有一个巨大的内存消耗Java过程,我正试图弄清楚他正在做什么,所有这些内存。 所以,我正在对这个PID做一个pmap -x,这是一个结果: Address Kbytes RSS Dirty Mode Mapping 0000000000001000 4 0 0 rw— [ anon ] 0000000000400000 48 0 0 rx– java 000000000050b000 4 4 4 rw— java 0000000003b9d000 264 224 212 rw— [ anon ] 0000000003bdf000 2199556 1887992 1830160 rw— [ anon ] 000000396c800000 112 108 0 rx– ld-2.5.so 000000396ca1c000 4 4 4 […]

JVM进程如何分配内存?

在理解JVM进程如何分配自己的内存方面,我有一点空隙。 我所知道的 RSS = Heap size + MetaSpace + OffHeap size OffHeap由线程堆栈,直接缓冲区,映射文件(库和jar)和JVM代码本身组成; 目前我正试图分析我的Java应用程序(Spring Boot + Infinispan),RSS是779M (它运行在docker容器中,所以pid 1可以): [ root@daf5a5ae9bb7:/data ]$ ps -o rss,vsz,sz 1 RSS VSZ SZ 798324 6242160 1560540 根据jvisualvm ,承诺的堆大小是374M Metasapce大小是89M 换句话说,我想解释799M – (374M + 89M)= 316M的OffHeap内存。 我的应用程序(平均)有36个活线程 。 每个线程消耗1M: [ root@fac6d0dfbbb4:/data ]$ java -XX:+PrintFlagsFinal -version |grep ThreadStackSize intx CompilerThreadStackSize = 0 […]

在Docker容器中运行的JVM的驻留集大小(RSS)和Java总承诺内存(NMT)之间的差异

场景: 我有一个运行在Docker容器中的JVM。 我做了一些内存分析,使用两个工具:1) 顶部 2) Java本机内存跟踪 。 数字看起来令人困惑,我试图找出造成差异的是什么。 题: Java进程报告RSS为1272MB,总Java内存报告为790.55 MB。 我怎样才能解释其余的内存1272 – 790.55 = 481.44 MB去哪里? 为什么我要在SO上看到这个问题之后继续保持这个问题: 我确实看到了答案,解释是有道理的。 但是,从Java NMT和pmap -x获得输出后, 我仍然无法具体映射哪些java内存地址实际上是驻留和物理映射的 。 我需要一些具体的解释(详细的步骤)来找出导致RSS和Java Total Commit内存之间的区别的原因。 顶部输出 Java NMT Docker内存统计信息 图表 我有一个docker集装箱运行超过48小时。 现在,当我看到一个包含以下内容的图: 提供给docker集装箱的总内存= 2 GB Java最大堆= 1 GB 总提交(JVM)=始终小于800 MB 使用的堆(JVM)=始终小于200 MB 使用非堆(JVM)=始终小于100 MB。 RSS =大约1.1 GB。 那么,在1.1 GB(RSS)和800 MB(Java Total Commit内存)之间吃什么呢?

Java – 设置首选项backingstore目录

我需要在我的Java应用程序中创build一个持久存储,以便所有用户都可以访问它。 所以我正在研究java.util.prefs.Preferences和使用systemRoot()在我的Windows上工作正常,保存在registry的数据。 但是我真的在Linux(Ubuntu)上面临一些问题。 我想使用其他应用程序已经使用的目录:/ usr / share /。 所以,我试图在运行时将systemRoot默认目录redirect到/ usr / share。 这是我的代码: System.setProperty("java -Djava.util.prefs.systemRoot", "/usr/share/myfolder"); Preferences pref = Preferences.systemRoot().node("/usr/share/myfolder"); 根据这个网站 ,我必须在执行这个命令行之前创build.systemPrefs文件夹,并且它隐含地说systemRoot()将会使用它。 当我执行我的程序,我得到以下警告: java.util.prefs.FileSystemPreferences syncWorld WARNING Couldn't flush system prefs: java.util.prefs.BackingStoreException: /etc/.java/.systemPrefs/usr create failed. 所以我假设System.setProperty不工作。 任何build议? 提前致谢!

为什么在使用waitFor的情况下查杀JVM也会终止它的subprocess呢?

如果不使用waitFor ,则杀死JVM对其subprocess没有影响。 这是一个例子。 Bash脚本: #!/usr/bin/env bash echo "Sleeping…" > 'log' sleep 30 echo "Wake up" >> 'log' Java代码: public class Code { public static void main(String[] args) throws Exception { Process process = Runtime.getRuntime().exec("./child.sh"); // process.waitFor(); } } Java Code发布后,JVM立即终止。 和ps -ef | grep 'child.sh' | grep -v grep ps -ef | grep 'child.sh' | […]

强制JVM执行所有没有页面caching的IO(例如O_DIRECT)

我正在做一些用Java编写的应用程序的基准testing。 实验结果不受页面caching影响是非常重要的(我使用的是linux) 因此,每当文件打开时,避免页面caching的最好方法是使用O_DIRECT。 因此,我更改了jre的源代码中的相应代码。 我的方法完全适用于通过FileOutputStream (例如写入)的所有内容,但对于FileInputStream (例如读取)不起作用。 在将O_DIRECT添加到FileInputStream的打开调用中时,JVM无法加载任何类: Error: Could not find or load main class perf.TestDirectIO 这个错误不是类path问题,因为我可以通过使用“unhacked”JVM来修复它。 所以打开文件似乎有一个问题。 我很高兴有关如何解决这个问题的任何build议。 如果有人想要做类似的事情,我已经logging在我的博客整个黑客 。 作为参考,这些是我所做的JVM代码的更改: jdk/src/share/native/java/io/FileInputStream.c : @@ -58,7 +60,8 @@ JNIEXPORT void JNICALL Java_java_io_FileInputStream_open(JNIEnv *env, jobject this, jstring path) { – fileOpen(env, this, path, fis_fd, O_RDONLY); + fileOpen(env, this, path, fis_fd, O_RDONLY | O_DIRECT); // this […]

什么会导致java进程大大超过Xmx或Xss限制?

我有7个不同的Java守护进程,我在3个不同的服务器上运行(全部7个)。 java命令行有-Xmx2048m和-Xss1024k。 在这3台服务器上,所有21个进程显示VIRT大小不超过2.5 GB。 根据哪个守护进程,RES大小从300到1.9 GB不等。 这是应该的。 input新的服务器。 更快的CPU,更多的RAM(16 GB而不是8 GB),稍微更新的java(旧服务器上的1.6.0_10-b33,新服务器上的1.6.0_31-b04)。 两个系统(和JVM)都是64位。 将2个守护进程移到了新的服务器上。 在新的服务器上,给予相同的任务,守护进程消耗的CPU(相当于一个核心的价值)要多得多,而且要做的更less。 (从旧系统上的5110处理器移动到新系统上的5620处理器)。 几乎完全是CPU使用的额外核心(GC线程??),并报告5 GB VIRT和2 GB RES用于一个守护进程,10.5 GB VIRT和2 GB RES用于另一个守护进程。 任何想法会导致java忽略(或似乎忽略,如果是这样的话)的内存限制?