Java 什么时候我的内存使用翻倍?

Java 什么时候我的内存使用翻倍?,java,servlets,jvm,jetty,Java,Servlets,Jvm,Jetty,我有一个servlet,用户将XML文件发布到该servlet 我使用以下方法读取该文件: String xml = request.getParameter("..."); 现在假设xml文档是10KB,因为我创建了变量xml,所以我现在使用10KB的内存来存储该变量,对吗 现在我需要解析该xml(使用xerces),并在将其传递给saxparsers解析方法时将其转换为输入流(http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/pa

我有一个servlet,用户将XML文件发布到该servlet

我使用以下方法读取该文件:

String xml = request.getParameter("...");
现在假设xml文档是10KB,因为我创建了变量
xml
,所以我现在使用10KB的内存来存储该变量,对吗

现在我需要解析该xml(使用xerces),并在将其传递给saxparsers解析方法时将其转换为输入流(http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/parsers/SAXParser.html)

所以,如果我把一个字符串转换成一个流,这是我内存使用量的两倍吗

需要对此进行一些澄清

如果我在单步执行代码时将进程与visualvm或jconsole连接,是否可以在调试程序中单步执行代码时查看是否使用了额外的内存


我想确保我这样做没有效率低下,因为这个端点会受到严重影响。

10000字节的文本通常会变成20KB

当您处理文本时,通常需要2-10倍的内存,因为您将使用这些信息做一些事情,例如创建数据结构


这意味着您可能需要200 KB。然而,考虑到在个人电脑中这代表着1美分的价值,我通常不会担心它。如果你有一个资源有限的设备,我会考虑把这个进程移到另一个设备,比如服务器。

< P>一个10000字节的文本一般变成20 KB。 当您处理文本时,通常需要2-10倍的内存,因为您将使用这些信息做一些事情,例如创建数据结构


这意味着您可能需要200 KB。然而,考虑到在个人电脑中这代表着1美分的价值,我通常不会担心它。如果你有一个资源有限的设备,我会考虑把这个进程移到另一个设备,比如服务器。

你会这样编码:

saxParser.parse(new InputSource(new StringReader(xml));
首先需要围绕
xml
创建
StringReader
。这不会使内存使用量翻倍,
StringReader
类仅包装
xml
变量,并在请求时逐字符返回它


InputSource
甚至更薄-它只需包装提供的
Reader
InputStream
。简而言之:不,您的
字符串将不会被复制,您的实现非常好。

您将这样编码:

saxParser.parse(new InputSource(new StringReader(xml));
首先需要围绕
xml
创建
StringReader
。这不会使内存使用量翻倍,
StringReader
类仅包装
xml
变量,并在请求时逐字符返回它


InputSource
甚至更薄-它只需包装提供的
Reader
InputStream
。因此,简而言之:不,您的
字符串不会被复制,您的实现非常好。

不,您不会得到字符串的两个副本,从而使内存加倍。其他东西可能会使内存加倍,但字符串本身不会被复制。
是的,您应该连接visualVm和jconsole以查看内存和线程处理的情况。

否,您不会得到两个字符串副本,从而使内存加倍。其他东西可能会使内存加倍,但字符串本身不会被复制。
是的,您应该连接visualVm和jconsole,以查看内存和线程处理的情况。

我认为您可能在实际运行代码之前对代码进行了优化。JVM恢复未使用内存的速度非常快

但是回答您的问题时,
stringxml=request.getParameter(“…”)
不会将内存增加一倍,它只是为指针分配额外的4或8个字节(取决于JVM是否使用压缩指针)

解析xml与SAX解析器不同,SAX解析器非常节省内存,因此不会占用太多内存,我认为每个处理程序大约20个字节加上您拥有的任何实例变量。。。显然,您可能会在处理程序中生成任何额外的对象

因此,您拥有的代码看起来是尽可能节省内存的(当然,这取决于处理程序中的内容)


除非您正在将代码嵌入到设备中或每秒运行10万次,否则我建议您不要优化任何东西,除非您确定需要优化它。JVM有一些疯狂的高级逻辑来优化代码,垃圾收集器可以非常快速地恢复短期对象。

我认为您可能在实际看到代码运行之前就在优化代码。JVM恢复未使用内存的速度非常快

但是回答您的问题时,
stringxml=request.getParameter(“…”)
不会将内存增加一倍,它只是为指针分配额外的4或8个字节(取决于JVM是否使用压缩指针)

解析xml与SAX解析器不同,SAX解析器非常节省内存,因此不会占用太多内存,我认为每个处理程序大约20个字节加上您拥有的任何实例变量。。。显然,您可能会在处理程序中生成任何额外的对象

因此,您拥有的代码看起来是尽可能节省内存的(当然,这取决于处理程序中的内容)


除非您正在将代码嵌入到设备中或每秒运行10万次,否则我建议您不要优化任何东西,除非您确定需要优化它。JVM有一些疯狂的高级逻辑来优化代码,垃圾收集器可以非常快速地恢复短期对象。

如果用户可以将大量文件发回servlet,那么最好不要使用getParameter()方法,直接处理流-

这样,您就可以在InputStream上使用SAX解析器(在处理之前,不需要将整个文本加载到内存中),这与基于字符串的解决方案是一样的

与字符串xml=getParameter(…)解决方案相比,这种方法扩展性好,每个请求只需要很少的内存。