小编osc*_*ter的帖子

为什么Tomcat使用共享库开始这么慢?

问题

我们Tomcat 7.0.35运行了25个webapps,它们共享相同的库,具有相同的版本(保证永远不会改变!).我想,而不是每个项目加载相同的库,我可以移动它们${catalina.home}/lib导致所需的内存负载减少.

然而,这是有代价的:每个webapp的部署时间从5秒增加到2分钟,这是不可行的!

我做了一些阅读(例如Class Loader HOW-TO),遗憾的是我无法找到减少启动时间的方法.有没有办法解决这个问题?

请求的分析信息

我跑jstack,并jvisualvm在两种不同的情况,我会在这里提出一些调查结果(请让我知道如果你需要更多的信息):

  • 似乎为每个项目特定的库加载: org.apache.catalina.loader.WebappClassLoader.findResourceInternal
    运行该方法的线程的jstack输出:

    "localhost-startStop-1" daemon prio=10 tid=0x00007f17f8001800 nid=0x13b8 runnable [0x00007f183c800000]
       java.lang.Thread.State: RUNNABLE
            at java.text.MessageFormat.subformat(MessageFormat.java:1250)
            at java.text.MessageFormat.format(MessageFormat.java:819)
            at org.apache.naming.StringManager.getString(StringManager.java:145)
            at org.apache.naming.resources.BaseDirContext.lookup(BaseDirContext.java:500)
            at org.apache.naming.resources.ProxyDirContext.lookup(ProxyDirContext.java:310)
            at org.apache.catalina.loader.WebappClassLoader.findResourceInternal(WebappClassLoader.java:3011)
            at org.apache.catalina.loader.WebappClassLoader.findResource(WebappClassLoader.java:1262)
            at org.apache.catalina.loader.WebappClassLoader.getResourceAsStream(WebappClassLoader.java:1499)
            at org.apache.catalina.startup.ContextConfig.populateJavaClassCache(ContextConfig.java:2302)
            at org.apache.catalina.startup.ContextConfig.populateJavaClassCache(ContextConfig.java:2294)
            at org.apache.catalina.startup.ContextConfig.populateJavaClassCache(ContextConfig.java:2308)
            at org.apache.catalina.startup.ContextConfig.populateJavaClassCache(ContextConfig.java:2291)
            at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2197)
            at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2154)
            at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:2034)
            at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1990)
            at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1976)
            at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1326)
            at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:882)
            - locked <0x00000007f52f3ec0> (a org.apache.catalina.startup.ContextConfig)
            at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:379)
            at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) …
    Run Code Online (Sandbox Code Playgroud)
  • java tomcat

    24
    推荐指数
    1
    解决办法
    1194
    查看次数

    如何在Java 8 Stream API中使用org.w3c.dom.NodeList?

    我相信接口org.w3c.dom.NodeList缺少一个stream()函数来利用Java 8的Stream API的好处.考虑引入默认方法以确保向后兼容性,我无法理解为什么此接口没有stream()功能.

    所以我的问题是:

    • 如何NodeList结合Stream API使用?
    • 如果不鼓励这样做,原因是什么?

    提前致谢!

    编辑:我目前正在使用此实用程序包装器:

    private static Stream<Node> nodeStream(NodeList list) {
        List<Node> nodes = new ArrayList<>();
    
        for (int n = 0; n < list.getLength(); ++n) {
            nodes.add(list.item(n));
        }
    
        return nodes.stream();
    }
    
    Run Code Online (Sandbox Code Playgroud)

    java dom

    23
    推荐指数
    2
    解决办法
    8924
    查看次数

    无法使用“terraform init -reconfigure”将 S3 后端中的 Terraform 远程状态转换为本地状态

    我正在使用 Terraform v1.0.0 并使用 AWS S3 和 AWS DynamoDB 创建远程后端,如Yevgeniy Brikman 的Terraform Up & Running中所述:

    \n
      \n
    1. 我为 S3 存储桶和 DynamoDB 表编写了代码,并通过以下方式创建了资源terraform apply
    2. \n
    3. 我添加terraform { backend "S3" {} }到我的代码中
    4. \n
    5. 我创建了一个backend.hcl包含所有相关参数的文件
    6. \n
    7. 我通过调用将本地状态移至 S3terraform init -backend-config=backend.hcl
    8. \n
    \n

    现在我想将远程状态转换回本地状态,以便我可以安全地删除远程后端。Brikman 解释说,要做到这一点,必须删除backend配置并调用terraform init. 当我尝试这个时,我看到这个:

    \n
    $ terraform init\nInitializing modules...\n\nInitializing the backend...\n\xe2\x95\xb7\n\xe2\x94\x82 Error: Backend configuration changed\n\xe2\x94\x82 \n\xe2\x94\x82 A change in the backend configuration has been detected, which may require migrating …
    Run Code Online (Sandbox Code Playgroud)

    terraform terraform-remote-state

    9
    推荐指数
    1
    解决办法
    4627
    查看次数

    MainActivity必须实现OnFragmentInteractionListener

    我已将片段添加到android导航抽屉活动中并收到此错误,我正在关注某个教程,并且在教程中工作的完全相同,我缺少什么吗?

    java.lang.RuntimeException: app.com.navigatemenu.MainActivity@56e7d2c must implement OnFragmentInteractionListener
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
      at android.app.ActivityThread.access$800(ActivityThread.java:151)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
      at android.os.Handler.dispatchMessage(Handler.java:102)
      at android.os.Looper.loop(Looper.java:135)
      at android.app.ActivityThread.main(ActivityThread.java:5254)
      at java.lang.reflect.Method.invoke(Native Method)
    
    Run Code Online (Sandbox Code Playgroud)

    主要活动

    package app.com.navigatemenu;
    
    import android.os.Bundle;
    import android.support.design.widget.FloatingActionButton;
    import android.support.design.widget.Snackbar;
    import android.view.View;
    import android.support.design.widget.NavigationView;
    import android.support.v4.view.GravityCompat;
    import android.support.v4.widget.DrawerLayout;
    import android.support.v7.app.ActionBarDrawerToggle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.Menu;
    import android.view.MenuItem;
    
    public class MainActivity extends AppCompatActivity
            implements NavigationView.OnNavigationItemSelectedListener {
        NavigationView navigationView = null;
        Toolbar toolbar = null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            MainFragment fragment = new MainFragment();
            android.support.v4.app.FragmentTransaction …
    Run Code Online (Sandbox Code Playgroud)

    java android

    1
    推荐指数
    1
    解决办法
    5440
    查看次数

    标签 统计

    java ×3

    android ×1

    dom ×1

    terraform ×1

    terraform-remote-state ×1

    tomcat ×1