英文:
Garbage collection in AWS lambda java 8
问题
我有一个用Java 8编写的AWS Lambda应用程序。最近,我发现内存使用率几乎达到了95%。然后,我将内存增加了大约100MB,然后这个问题就解决了。我想要了解一件事,在其他应用程序中,比如ECS或任何通用的JAVA应用程序,在内存使用率达到大约90%时,GC会开始运行,Lambda应用程序是否也会出现相同的行为?
或者,Java 8编写的Lambda应用程序中是否存在其他内存清理的方式?
英文:
I have an AWS lambda application written in Java 8. Recently I was seeing the memory was reaching to almost 95%. Then I increased the memory by almost 100MB, and then this issue was not there. I wanted to understand one thing here, like in other applications like ECS or any general JAVA application, the GC comes into play once the memory reaches approx 90%, does that same behavior come up in case of lambdas as well ?
Or, is there any other way of memory cleanup happening in lambda applications written in java 8 ?
答案1
得分: 2
启用日志以确保其正常工作:
在Java 9之前,包括Java 8,在配置垃圾收集日志时,可以按如下操作:
JAVA_TOOL_OPTIONS=-XX:+PrintGCDetails -XX:+PrintGCDateStamps
Java 11使用统一日志系统(JEP 158和JEP 271),该系统已在Java 9中引入。可以使用环境变量配置日志记录:
JAVA_TOOL_OPTIONS=-Xlog:gc+metaspace,gc+heap,gc:stdout:time,tags
AWS Lambda上JVM应用程序的生命周期
首先让我们重新审视AWS Lambda Java运行时及其JVM的生命周期:
- 调用Lambda函数。
- AWS Lambda启动执行上下文。这是一个临时的运行时环境,基于您提供的配置设置,如权限、内存大小和环境变量。
- AWS Lambda为执行上下文的每个实例在Amazon CloudWatch Logs中创建一个新的日志流。
- 执行上下文初始化JVM和您的处理程序代码。
AWS Lambda在预期将会有另一个Lambda函数调用时保持执行上下文一段时间。实际上,在Lambda函数完成后,服务会冻结执行上下文。如果AWS Lambda选择重用它,它将在再次调用Lambda函数时解冻执行上下文。
在调用期间,JVM也会像平常一样维护垃圾收集。在调用之外,JVM及其垃圾收集等维护过程也会被冻结。
来源链接:https://aws.amazon.com/blogs/architecture/field-notes-monitoring-the-java-virtual-machine-garbage-collection-on-aws-lambda/
英文:
Enable logs if you want to be sure how it is working:
Prior to Java 9, including Java 8, you configure the garbage collection logging as follows:
JAVA_TOOL_OPTIONS=-XX:+PrintGCDetails -XX:+PrintGCDateStamps
Java 11 uses the Unified Logging System (JEP 158 and JEP 271) which has been introduced in Java 9. Logging can be configured with the environment variable:
JAVA_TOOL_OPTIONS=-Xlog:gc+metaspace,gc+heap,gc:stdout:time,tags
The lifecycle of a JVM application on AWS Lambda
> Let’s first revisit the lifecycle of the AWS Lambda Java runtime and
> its JVM:
>
- A Lambda function is invoked.
- AWS Lambda launches an execution context. This is a temporary runtime environment based on the configuration settings you provide, like permissions, memory size, and environment variables.
- AWS Lambda creates a new log stream in Amazon CloudWatch Logs for each instance of the execution context.
- The execution context initializes the JVM and your handler’s code.
>
> AWS Lambda maintains the execution context for some time in
> anticipation of another Lambda function invocation. In effect, the
> service freezes the execution context after a Lambda function
> completes. It thaws the execution context when the Lambda function is
> invoked again if AWS Lambda chooses to reuse it.
>
> During invocations, the JVM also maintains garbage collection as
> usual. Outside of invocations, the JVM and its maintenance processes
> like garbage collection are also frozen.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论