jsvc 启动java 在linux下的实现原理
jsvc 是在apache的daemon项目下开源项目,主要功能可以使一些运行在普通用户下的java进程获取一些root权限下的权利,比如端口在1024下等。
在自己的java代码中,实现start, init , stop,destroy的方法,将自己的编译打成jar文件, 通过调用jsvc 来启动
static int get_legacy_caps(){ struct __user_cap_header_struct caphead; struct __user_cap_data_struct cap; memset(&caphead, 0, sizeof caphead); caphead.version = LEGACY_CAP_VERSION; if (syscall(__NR_capget, &caphead, &cap) < 0) log_error("capget failed: %m"); log_debug("PID is %d print the cap 0x%x, 0x%x, 0x%x\n", getpid(), cap.effective, cap.permitted, cap.inheritable); return 0;}
通过调用JNI_CreateJavaVM 启动虚拟机器,同时调用包common-daemon里的DaemonLoader class, 调用你所写的类中的start,...这些方法。
在jsvc 里在启动java以后就将jvm的虚拟机的进程的capability 设置成了0, 导致在虚拟机里的创建线程受到max process 的控制, ulimit -u
已经创建issue: https://issues.apache.org/jira/browse/DAEMON-270, 短期解决办法可以设置ulimit 到比较大的值