我有一个函数可以解析来自端点的 JSON 响应。我用大约 20k 不同的输入来调用这个函数。像这样的事情:
for (Input input: inputList) {
// We create a new getRequest with the query
HttpGet getRequest = new HttpGet(input.getUrl());
// We make the getRequest accept application/json data
getRequest.addHeader("Accept", "application/json");
JSONParser jsonParser = new JSONParser();
JSONArray parsedArray = new JSONArray();
CloseableHttpResponse response = httpClient.execute(getRequest);
InputStream inputStream = response.getEntity().getContent();
parsedArray = (JSONArray) jsonParser.parse(new InputStreamReader(inputStream, "utf-8"));
parsedArrays.add(parsedArray);
response.close();
}
我正在使用json-simple
:
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
此刻,我在循环内部声明 JSONParser,并且正在考虑在循环外部声明它是否会更好。
是否最好只声明一次解析器,然后将其像参数一样传递给函数,或者 JVM 已经优化了这种事情?
最佳答案
这取决于您是否从不同线程调用该方法。在这种情况下,如果 JSONParser 不是线程安全的,则可能会出现同步问题,并且在方法中实例化 JSONParser 可能会更好。
如果只有一个线程,则可以将 JSONParser 作为方法参数传递。
但我猜堆的增长是因为输入数据而不仅仅是 JSONParser 对象。
垃圾收集器主要在堆已满时被激活(在 HotSpot 中),因此在激活 gc 之前可能需要更多时间。
如果您需要在分配新对象时节省时间(new
、invokespecial
和构造函数指令),那么您应该关心这一点,但在这种情况下您需要考虑每一个对象的创建,为此还有其他语言:)。让 JVM 完成它的工作即可:)。
关于java - 在函数内部或外部声明对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31992007/