当前位置: 首页 > 面试题库 >

使用java.library.path和LD_LIBRARY_PATH之间的区别

齐航
2023-03-14
问题内容

设置JVM参数之间有区别吗

-Djava.library.path=/path

在JVM启动并设置Linux环境变量时

export LD_LIBRARY_PATH=/path

JVM启动之前?

两种方法的优点/缺点是什么?


问题答案:

第一种形式

-Djava.library.path=/path

将在java字节码级别处理,System.loadLibrary先调用Runtime.loadLibary,然后再调用java/lang/ClassLoader.loadLibrary。在函数call中ClassLoader.loadLibraryjava.library.path将检查system属性以获取库的完整路径,并将此完整路径传递给本机代码以调用system
api
dlopen/dlsym,最终使库被加载。您可以从OpenJDK存储库浏览源。以下代码段是我从链接中复制的段。

这种形式的好处是,如果您的库路径存在问题,您将在Java代码中得到错误,警告或异常。

// Invoked in the java.lang.Runtime class to implement load and loadLibrary.
static void loadLibrary(Class fromClass, String name,
                        boolean isAbsolute) {
    ClassLoader loader =
        (fromClass == null) ? null : fromClass.getClassLoader();
    if (sys_paths == null) {
        usr_paths = initializePath("java.library.path");
        sys_paths = initializePath("sun.boot.library.path");
    }
    if (isAbsolute) {
        if (loadLibrary0(fromClass, new File(name))) {
            return;
        }
        throw new UnsatisfiedLinkError("Can't load library: " + name);
    }
// ....

第二种形式

export LD_LIBRARY_PATH=/path

根据的文件,将以本机处理 dlopen/dlsym

 dlopen()
   The function dlopen() loads the dynamic library file named by the null-terminated string filename and returns an opaque  "handle"  for  the
   dynamic  library.   If  filename is NULL, then the returned handle is for the main program.  If filename contains a slash ("/"), then it is
   interpreted as a (relative or absolute) pathname.  Otherwise, the dynamic linker searches for the library as follows (see ld.so(8) for fur‐
   ther details):

   o   (ELF  only)  If  the  executable  file for the calling program contains a DT_RPATH tag, and does not contain a DT_RUNPATH tag, then the
       directories listed in the DT_RPATH tag are searched.

   o   If, at the time that the program was started, the environment variable LD_LIBRARY_PATH was defined to contain a colon-separated list of
       directories, then these are searched.  (As a security measure this variable is ignored for set-user-ID and set-group-ID programs.)

这样,如果您的库路径存在一些问题,并且系统无法加载您的库,则系统不会提供太多线索,会提示发生什么,并且会静默地失败(我想)。这取决于是否执行LD_LIBRARY_PATH,Android
是否使用它LD_LIBRARY_PATH来确定库的位置,您可以从此处查看Android的实现。



 类似资料:
  • 问题内容: 我有一些无法理解的区别和。当我使用它时,默认情况下会创建一个JoinTable,并且如果您添加mapledBy属性,则两个实体之间将具有双向关系。 我有一个可能属于许多人,一个可能属于许多人。我不知道是否应该使用,或者因为对我来说这似乎是完全相同的事情,但可能并非如此。 有人可以解释吗? 问题答案: 好吧,不同之处在于您尝试使用对象反映的设计。 在您的情况下,每个都可以分配给多个-这是

  • 问题内容: 我错放了太多次了,我想我一直忘记,因为我不知道两者之间的区别,只是一个给了我我期望的价值,而另一个却没有。 为什么是这样? 问题答案: 是的简写形式(尽管请注意,该表达式只会被计算一次。) 是的,即指定一元的到。 例子:

  • 问题内容: 因此,我有一段简单的代码可以打印出整数1-10: 然后,如果仅在第3行上更改一个运算符,它将打印出无限数量的1整数(我知道为什么会这样做)。为什么在运行第二个程序时没有出现语法错误?如果赋值运算符后面跟着一个加法运算符,它不会调用语法错误吗? 问题答案: 与相同, 只是意味着。

  • 有人能指出两者之间的区别吗?当某人应该在上使用'.get_attribute("innerhtml“)‘时?