我想减少 Java 应用程序的内存占用以减少交换。为此,我一直在考虑减小堆栈大小(Xss 参数),但不确定堆栈内存是如何分配的,以及每个线程的默认 512k(对于 32 位操作系统)是否始终位于常驻内存中,无论它有多少实际使用。
减少堆栈内存会导致交换减少吗?
更新:请不要建议分析应用程序 - 它已经完成。
我想减少 Java 应用程序的内存占用以减少交换。为此,我一直在考虑减小堆栈大小(Xss 参数),但不确定堆栈内存是如何分配的,以及每个线程的默认 512k(对于 32 位操作系统)是否始终位于常驻内存中,无论它有多少实际使用。
减少堆栈内存会导致交换减少吗?
更新:请不要建议分析应用程序 - 它已经完成。
你正在运行多少个线程?即使有大量线程和非常大的堆栈大小(例如,10k 线程和 256KB 堆栈大小),也只有 2GB 的堆空间。
您说您在 32 位 JVM 上运行,所以我假设这是一个相对较小的系统。你有几个选择:
切换到 64 位 JVM。现在你有大量的地址空间,堆栈大小应该是无关紧要的
你的机器太小了。如果 2gb 的堆栈对您的 10k+ 线程来说是个问题,那么您在太“小”的机器上运行太“大”的应用程序。少做软件或购买更多硬件
减少线程数
问题实际上出在其他地方,而您正在吠叫错误的树
您正在使用多少内存,需要节省多少内存?
由于每个线程的堆栈只有 512K,这意味着您需要 200 个线程才能开始输入一个可能值得保存的值 (100Mb)
由于堆栈内存的使用会“非常频繁”,因此我认为它是被换出的糟糕目标。除非您正在处理内存受限的环境?
是的,当然它的后进先出规则,少堆栈少交换