标签: code-caching

Java和Tomcat - CodeCache已满.编译器已被禁用

我的情况

  • 我开发了一个用于文档分析的Web服务
  • 此Web服务读取txt和pdf文档
  • 为了阅读pdf文件,我使用的是我的大学顾问开发的java库
  • 我使用的是Java 7
  • 我目前正在Tomcat v7.0上部署它
  • 如果我从我的应用程序生成war文件并将其托管在我的电脑上的本地tomcat上,或者如果我通过eclipse ee在tomcat上启动我的应用程序,则读取pdf文件没有问题

我的问题

  • 我已经为自己设置了一个小服务器(不是最好的硬件,双核cpu,4g ram),安装了tomcat,java以及其他对我来说似乎必要的东西.
  • 当我现在使用tomcat管理器在服务器tomcat上部署war文件时,一切正常,直到我尝试让应用程序读取pdf文件.
  • 在应用程序读取了几个页面之后,我收到一条错误,CodeCache已经填满并且编译因此而被禁用.

pdf导入期间的错误输出示例

此日志显示如何导入pdf,并在某些时间点启动错误消息.我标记了erorr消息胖.

...

2012年5月31日上午11:15:40 infovis.structure.pdf.PDFImport进程信息:处理

2012年5月31日上午11:15:40 infovis.structure.pdf.PDFImport process INFO:Processing Page 14

2012年5月31日上午11:15:41 infovis.structure.pdf.PDFImport process INFO:Processing Page 15

Java HotSpot(TM)64位服务器VM警告:CodeCache已满.编译器已被禁用.Java HotSpot(TM)64位服务器VM警告:尝试使用-XX增加代码缓存大小:ReservedCodeCacheSize =代码缓存[0x00007fa43437e000,0x00007fa4347fe000,0x00007fa43737e000] total_blobs = 1858 nmethods = 1318 adapters = 490 free_code_cache = 44631Kb largest_free_block = 45618688 Java HotSpot (TM)64位服务器VM警告:CodeCache已满.编译器已被禁用.Java HotSpot(TM)64位服务器VM警告:尝试使用-XX增加代码缓存大小:ReservedCodeCacheSize =代码缓存[0x00007fa43437e000,0x00007fa4347fe000,0x00007fa43737e000] total_blobs = 1859 nmethods = 1318 adapters = 490 free_code_cache = 44631Kb largest_free_block = 45618688

2012年5月31日上午11:16:19 infovis.structure.pdf.PDFImport process INFO:Processing Page 16

2012年5月31日上午11:16:20 infovis.structure.pdf.PDFImport process …

java compiler-construction tomcat code-caching

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

为什么java代码缓存大小在增长?

我有这个基本程序,除了坐在那里等待输入之外什么都不做:

import java.io.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Basic {
    public static void main(String[] args) throws Exception{
        try{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String input;
            input=br.readLine();
        }catch(IOException io){
            io.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个:

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15001 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false Basic
Run Code Online (Sandbox Code Playgroud)

我通过JConsole连接看到这个:

codecache增加

这只是因为核心java bytcode最初被编译?当进程没有做任何事情时,如何增加codecache?

当我有这个版本(使用Thread.sleep):

public class Basic {
    public static void main(String[] args) throws Exception{
        while(true) {
            Thread.sleep(5000);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

codecache增加

那么......为什么会这样呢?

PS这是输出java -version:

java version "1.6.0_37"
Java(TM) SE Runtime Environment …
Run Code Online (Sandbox Code Playgroud)

java performance jvm-hotspot code-caching jvm-codecache

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