java - 如何为java程序分配堆内存
问题描述
我有一个 java 程序,它在无限 for 循环中创建 20 个不同的字符串对象
for(int i = 0 ; i >=0 ; i++){
String s = new String("Test");
String s1 = new String("Test");
/*creating more string objects here */
System.out.println(s);
}
并使用 java -Xms1m -Xmx1m HelloWorld 运行该程序并打开 VisualVM 以监控堆大小。我不确定为什么它在顶部显示大小和最大值均为 2,097,152 B。不应该是 1,000,000 吗?而且我也想知道为什么使用不会超过 700,000 B 。它总是在 300000 到 700000 之间
请查看附件,不知道为什么 CPU 下会出现“此 JVM 不支持”的消息?
解决方案
您可以使用几个 JVM 标志:
- -Xmx 为特定 JVM 设置最大堆内存(像这样使用:-Xmx2G。它将可用堆限制为 2GB)
- -Xms 为 JVM 设置初始分配的堆数量(使用 ike 这个:-Xms2G。它将初始堆大小设置为 2GBs)
您始终可以从一组现有算法中设置垃圾收集算法:
- -XX:+UseG1GC 使用 G1 gc
- -XX:+UseConcMarkSweepGC 使用并发标记和扫描 gc
你可以在这里检查一些标志:http: //files.zeroturnaround.com/pdf/zt_JVM-options-cheat-sheet.pdf
推荐阅读
- python - 销毁所有子窗口
- regex - 找出正则表达式中的最后一个数字
- visual-studio-code - 在 Visual Studio Code 中绘制箭头和符号
- java - 我有一个 svg 文件内容,我想根据匹配的子字符串删除一个字符串
- javascript - 单击按钮后显示 HTML/CSS 类
- javascript - 处理 webpack 动态导入承诺拒绝的正确方法是什么?
- database - 我应该如何创建产品属性数据?
- php - 如何从 JSON 编码字符串中提取特定数据
- android - 无法停止线程执行 onPause 并恢复执行 onResume
- keycloak - Keycloak 用户 - 按国家/地区区分用户是个好主意吗?