草庐IT

java - Jetty 启动需要多长时间?

coder 2024-03-13 原文

启动 Jetty 在我的 Web 应用程序开始加载之前有很长的延迟(8 秒)

13:50:10 [INFO] jetty-9.4.5.v20170502
13:50:18 [INFO] Scanning elapsed time=146ms

启用调试日志记录后,有两个有趣的步骤

  • 提取依赖的war-application,毕竟需要时间(3s)

    10:03:13 [DEBUG] Extracting entry = null from jar file:[..]/application-1.0.war
    10:03:16 [DEBUG] Unpacked overlay: jar:file:[..]/application-1.0.war!/ to file:[..]
    
  • 以及以下 4 秒的延迟:

    10:03:16 [DEBUG] Service loaders found in 0ms
    10:03:20 [DEBUG] loaded interface javax.servlet.ServletContainerInitializer
    

我如何调试或影响导致超过 4 秒延迟的原因?


配置

pom.xml

<dependency>
    <groupId>com.company</groupId>
    <artifactId>application</artifactId>
    <version>1.0</version>
    <type>war</type>
</dependency>

[...]

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>9.4.5.v20170502</version>
    <configuration>
        <webApp>
            <webInfIncludeJarPattern>empty</webInfIncludeJarPattern>
            <containerIncludeJarPattern>empty</containerIncludeJarPattern>
        </webApp>
    </configuration>
</plugin>

web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
     version="3.1" 
     metadata-complete="true">

   <context-param>
       <param-name>contextClass</param-name>
       <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
   </context-param>

   <context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>com.app.AnnotationConfig</param-value>
   </context-param>

   <listener>
       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>

   [...]

</web-app>

最佳答案

你有一个比平均水平更大的 webapp(70MB 的 WEB-INF/lib jar),但没有什么特别大的(我见过 800MB 的 war 文件)

发生的一些事情可能会导致速度变慢。

  1. 将 war 解压到 WebApp 临时目录
  2. 将资源 jar ( WEB-INF/lib/*.jar!/META-INF/resources/) 解压到 WebApp 临时目录
  3. Jar 字节码扫描(用于在 @HandlesType 类上的 javax.servlet.ServletContainerInitializer 注释中声明的注释和类型)

如果您的文件系统很慢,那么以上任何一项都会减慢您的速度。

Note: the DEBUG logging of Jetty will tell you the timing of each of those (even breaking down the timing of bytecode scanning timing to the individual jar)

字节码扫描步骤是最常影响启动时间的地方。

配置<containerIncludeJarPattern>不推荐使用“empty”,这是 Servlet、JSP、Taglib 运行所必需的。

The containerIncludeJarPattern default无论如何只是 servlet/jsp/taglib jar 。 (扫描需要几微秒)

<webInfIncludeJarPattern>也不应该只是“空”,它至少应该包括你的 WEB-INF/classes内容(又名 .*/classes/.* )。考虑将其设置为仅扫描那些 WEB-INF/lib你需要的 jar 。 (类似 .*/lib/spring-.*\.jar$|.*/classes/.* )

WEB-INF/lib/*.jar 中类的大小(以字节为单位)和 WEB-INF/classes实际上是无关紧要的。与时间更相关的是找到的文件数量(甚至是非类文件)。

如果您使用资源 jar (WEB-INF/lib/*.jar!/META-INF/resources/),那么这是一个严重的惩罚/缓慢启动的根源。

您可以做什么:

首先查看您的 DEBUG 日志,它会告诉您哪里有问题。

接下来,使用 quickstart 进行调查如果启动时间很重要,Jetty 的功能(它有 2 个部分,一个构建时组件,用于扫描和构建包含在您的 war 中的 jetty-quickstart.xml,以及一个运行时模块,用于查找并使用 jetty-quickstart.xml(如果找到)

最后,如果您使用的是资源 jar (WEB-INF/lib/*.jar!/META-INF/resources/),请考虑将这些内容移出 WEB-INF/lib。并在构建过程中进入 war 中的正常位置(maven 中的 package 阶段)。这些很方便,但有许多您似乎不喜欢的副作用。 (还要考虑运行时资源解析冲突的问题)。

关于java - Jetty 启动需要多长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45590429/

有关java - Jetty 启动需要多长时间?的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  3. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  6. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  7. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  8. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  9. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  10. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

随机推荐