- 虚拟机中的内存
- Runtime.getRuntime.maxMemory
- Runtime.getRuntime.totalMemory
- Runtime.getRuntime.freeMemory
- 已用内存
- 设置虚拟机内存大小
- 问题
- 参考地址
首先了解下,内存分配和回收
-
Java程序是运行在JVM上的,JVM会分配一个初始内存给这个应用程序,并设置一个最大内存值,
-
这个初始分配的内存大小和设置的最大可用的内存大小在一定程度生影响应用程序的性能
-
当预先分配的那块堆内存大小使用完时,JVM会在向操作系统(物理内存)申请堆内存,但是JVM不会无限制的问操作系统申请堆内存
-
当这个应用程序占用的实际内存达到一个堆可用最大值时,Java程序还让JVM向操作系统申请堆内存,并且JVM无法通过垃圾回收机制回收当前的堆内存来为Java应用程序服务,就会给程序抛出异常:java.lang.OutOfMemoryError
-
JVM的垃圾回收时机并不是在堆内存达到最大值时才进行,它的运行时机是不确定的
Java虚拟机能构从操作系统那里挖到的可用的最大内存,最大堆大小,以字节为单位,如果内存本身没有限制,则返回值Long.MAX_VALUE
JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。
-Xmx 也指 maxMemory的值
但是,maxMemory的值会小于 -Xmx :
Runtime.getRunTime.maxMemory为啥比Xmx指定的内存小:https://blog.csdn.net/wisgood/article/details/79850093
已占用的内存,初始堆大小
方法返回的是java虚拟机现在已经从操作系统那里挖过来的内存大小,也就是java虚拟机这个进程已占用的所有内存。
-Xms 指的是totalMemory的初始值
JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;
空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。
已经占用,但实际并未使用的内存
调用gc方法可能导致freeMemory返回值的增加
为什么会有totalMemory()和maxMemory()。答案是JVM延迟分配内存。
已用内存Runtime.getRuntime.totalMemory - Runtime.getRuntime.freeMemory = 已用内存
设置虚拟机内存大小Xmn、Xms、Xmx、Xss都是JVM对内存的配置参数,我们可以根据不同需要区修改这些参数,以达到运行程序的最好效果
-Xms 堆内存的初始大小,默认为物理内存的1/64
-Xmx 堆内存的最大大小,默认为物理内存的1/4
-Xmn 堆内新生代的大小。通过这个值也可以得到老生代的大小:-Xmx减去-Xmn
-Xss 设置每个线程可使用的内存大小,即栈的大小。在相同物理内存下,减小这个值能生成更多的线程,当然操作系统对一个进程内的线程数还是有限制的,不能无限生成。线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误。
问题maxMemory 大于 -Xmx 这是为什么?
目前只找到
-xms -xmx无效:https://blog.csdn.net/zzbbing/article/details/108089926
不太懂啊,有问题欢迎指正
Rumtime.getRuntime()方法的几个获取内存值方法的含义:https://blog.csdn.net/lihongtai/article/details/84562218
JVM优化之 -Xss -Xms -Xmx -Xmn 参数设置:https://blog.csdn.net/yrwan95/article/details/82826519?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.pc_relevant_aa&utm_relevant_index=1
JVM参数汇总:https://www.cnblogs.com/duanxz/p/3482366.html



