在EC2实例上为Tomcat分配Java堆

在EC2实例上为Tomcat分配Java堆,java,tomcat,amazon-ec2,amazon-web-services,heap,Java,Tomcat,Amazon Ec2,Amazon Web Services,Heap,我正在编写一个Java servlet,计划使用Elastic Beanstalk在Amazon AWS上部署它。我的测试表明,使用Beanstalk使用的TomcatAMI的一个小EC2实例运行良好 我试图找出如何为这个配置正确分配Java堆空间。一个小实例有1.7GB的内存,所以我认为1024MB的堆可以很好地工作。我意识到其他事情也需要内存,即使这个实例的唯一“真正”目的是运行Tomcat。我还知道,在某些情况下,标准Sun/Oracle JVM在大堆中无法真正工作 这是分配内存的合理方法

我正在编写一个Java servlet,计划使用Elastic Beanstalk在Amazon AWS上部署它。我的测试表明,使用Beanstalk使用的TomcatAMI的一个小EC2实例运行良好

我试图找出如何为这个配置正确分配Java堆空间。一个小实例有1.7GB的内存,所以我认为1024MB的堆可以很好地工作。我意识到其他事情也需要内存,即使这个实例的唯一“真正”目的是运行Tomcat。我还知道,在某些情况下,标准Sun/Oracle JVM在大堆中无法真正工作


这是分配内存的合理方法吗?我应该多用还是少用?我可以使用什么工具来帮助确定最佳配置?

1024似乎还可以,也许有点多

我不太清楚您的servlet在做什么,但为了让您了解一下,我有一个电子商务应用程序,每天大约有1000名用户在2个小型ec2实例上运行。Tomcat负载通过mod_jk分配

我根本没有调整JVM,而是保留了默认设置。我还使用terracotta分布式对象缓存,这个过程似乎消耗了大部分内存

您是否部署在基于linux的操作系统或windows上?在我看来,linux在管理可用内存方面做得更好

至于工具,我建议将应用程序按原样部署到一个小型ec2实例,并使用类似JMeter的工具对应用程序进行压力测试。在压力测试期间,您可以打开top实用程序(假设您的应用程序在linux上,并且安装了top)


尝试通过查看应用程序可以处理的负载来中断应用程序。这就是ec2的优点,您可以在几分钟内设置一个测试环境,然后立即放弃它。

检查newrelic for java以确定您的堆使用模式。

感谢您的输入。我不会详细介绍我们的应用程序。它允许用户查看关于不同主题的信息,然后可能会向其中添加更多信息。关于主题的一些信息是从数据库动态生成的,而其中大部分是静态数据,我们在启动时从文件中读取,并保存在堆上我们自己的数据结构中。总的来说,大约有250-300MB的数据。我猜当我们真正开始运行时,我们每天会有几万用户。在我以前的AWS项目中,我试图控制一切。对于这个项目,我决定我需要花更多的时间在“真实”应用程序上,以及如何营销它,而不是简单的it工作,所以我只是使用股票豆茎。这意味着使用他们的股票AMI,即Linux和弹性负载平衡器。您使用mod_jk而不是ELB来分配负载有什么原因吗?既然如此,为什么你认为1024有点太多了?剩下的700MB用于其他所有任务,这实际上只是标准操作系统任务。我看得对吗?@SanderSmith我仍然在使用ELB,但我用它来平衡两个小型apacheweb服务器实例。然后从我的apacheweb服务器实例中使用mod_jk将负载分配给我的tomcat实例。Apache在服务静态资源和处理SSL方面做得更好,这就是我使用它们的原因。我想你能做的最好的事情就是测试负载并从那里做出决定。如果您的应用程序期望每天接收10000个用户,那么我认为无论您如何调优JVM,一个小ec2实例都不够