java -version
java -help
java =showversion
-Xint //解释执行
-Xcomp //第一次使用就编译成本地代码
-Xmixed //混和模式
「公式:-XX:+代表增加,-代表剔除某个属性值」
查看某个Java
进程是否开启了某些JVM参数的方法:
jps -l
获取所有后台运行的Java
进程jinfo -flag JVM参数 进程ID
获取这个Java
程序对该JVM
参数的开启状况**案例:**当前程序是否打印了GC
收集细节
代表当前程序没有开启垃圾回收
这是开启以后的
「公式:-XX:属性key=属性值value」
「案例:」
-XX:MetaspaceSize=128m
修改元空间大小
-XX:MaxTenuringThreshold
修改对象最大存活年龄
-XX:InitialHeapSize
初始堆大小
「修改前」
「修改后」
「jinfo -flags
获取所有JVM开启的参数」
Xms
和Xmx
分别代表堆的标准大小和最大空间。
Xms
相当于-XX:InitialHeapSize
Xmx
相当于-XX:MaxHeapSize
java -XX:+PrintFlagsInitial -version
打印Java
版本信息和初始默认JVM参数设置
java -XX:+PrintFlagsFinal -version
打印被更新过的JVM参数设置
java -XX:+PrintCommandLineFlags
打印一些基本信息,包括使用的垃圾回收器
打印了使用的垃圾回收器
-Xms 初始大小为物理内存的1/64 等价于-XX:InitialHeapSize
-Xmx 默认为物理内存的1/4 等价于-XX:MaxHeapSize
-Xss 单个线程栈大小 一般为512~1024k
-Xmn 设置年轻代大小
-XX:MetaspaceSize 设置元空间大小
-XX:+PrintGCDetails 输出GC日志信息
-XX:SurvivorRatio 设置Ende区在新生代中的占比
-XX:NewRatio 设置老年代在堆中的占比
-XX:MaxTenuringThreashold 设置对象的最大年龄
「关于新生代中的Eden和Survivor的占比问题:笔者JDK得出的是6:1,但查看官方文档得出的结论是8:1」
Java
的默认引用类型,所有的对象创建都是强引用,当对象引用变量为null
的时候被回收
通过SoftReference
设置软引用,当内存空间不足的时候,软引用对象被直接回收
通过WeakReference
设置若引用,当GC运行的时候,就会将这个类型的对象回收
本地图片加载的时候,通常我们会将之加载到缓存中。但是当图片数量急剧增加的时候就有可能发生OOM
,所以我们可以通过虚引用或者软引用保存图片的对象
例如我们可以构建一个HashMap
对象封装URL
和图片对象映射,其中的图片对象使用弱引用或者软引用的方式。当内存不足的时候自动回收内存中的图片对象
HashMap<String,SoftReference<Bitmap>> imageCache =
new HashMap<>();
存储一个弱引用的Key
,当一个key
是无效的时候,该键将被移除
通过PhantomReference
设置虚引用,该引用相当于没有引用,通过get
方法不能获取引用的值,唯一的作用就是配合ReferenceQueue
使用,在gC
以后被放入引用队列中,做一些后续操作,比如通知等等。
软引用,弱引用,虚引用被GC
以后不会立即消失,而是添加到了ReferenceQueue
引用队列中,可以做后续的操作。
「案例演示」
可以看到在GC以后引用队列中有值了
java.lang.StackOverflowError
栈溢出,栈的默认空间大小为512~1024k
当超过这个界限以后就会触发这个错误
java.lang.OutOfMemoryError:Java heap space
堆溢出。
「常见的场景:大对象(直接超过老年区大小);强引用对象的不断出现」
java.lang.OutOfMemoryError:overhead limit exceeded
GC占据了系统98%的运行,但是仅仅回收了2%
不到的内存空间。导致重复GC,但空间没法释放。爆出这个错误
java.lang.OutOfMemoryError:Direct buffer memory
堆外内存溢出,使用NIO
的时候会出现
NIO中使用
java.lang.OutOfMemoryError:unable to create new native thread
默认大小为1024个
java.lang.OutOfMemoryError:Metaspace
默认大小为20M