1.什么是垃圾
一般情况下在出栈时,该方法所引用的实例对象就变成了没有任何地方指向他,变成了一个未被引用的对象
定义:如果某个实例对象没有任何一个方法的局部变量指向他,也没有任何一个类的静态变量,包含常量等地方指向他就称之为堆中的垃圾
2.什么时候触发GC
对于堆中的垃圾是在新建对象的时候,发现堆中内存不足时才会去触发GC
GC的内存区域包含了堆,方法区
GC应当保持频率越少越好
3.jvm分代模型
分为新生代,老年代,永久代
新生代和老年代存在于堆内存中
永久代存在于方法区(1.8以后为元数据区)
刚创建出来的对象绝大部分都是在新生代
默认会将15次以上的对象放入老年代
另外虚拟机栈是用不到GC的因为在出栈的时候,相应的局部变量等数据都会被直接删掉
4.JVM内存核心参数
堆内存配置
xms java堆内存大小
XMX java堆内存的最大大小
XMN java堆中新生代的大小
xms-XMN 就是老年代的大小了
方法区配置
XX:PermSize 永久代大小
XX:MaxPermSize 永久代最大大小
XSS 每个线程的栈内存大小
一般堆内存和堆最大内存是一致的
xms等于XMX
一般永久代大小也是等于永久代最大大小的
XX:PermSize等于XX:MaxPermSize
配置时
-xms512M -Xmx512M -Xmn256M -Xss1M (堆和栈配置)
-XX:PermSize=128M -XX:MaxPermSIze=128(永久代配置)
配置模板:
-xms4096M -Xmx4096M -Xmn3072M -Xss1M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+UseParNewGC -XX:+UseConcmarkSweepGC -XX:CMSInitiatingOccupancyFaction=92 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSParallelInitialMarkEnabled -XX:+CMSScavengeBeforeRemark -XX:+disableExplicitGC-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\test\dump\test.hprof
-XX:+UseParNewGC 指定parnew做为ygc回收器
-XX:+UseConcmarkSweepGC 指定cms做为fullgc回收器
-XX:CMSInitiatingOccupancyFaction 为空间担保百分比 老年代超过92%触发fgc
-XX:+UseCMSCompactAtFullCollection 开启内存碎片整理
-XX:CMSFullGCsBeforeCompaction 多少次full gc之后做一次内存整理 默认是0也就是每一次fullgc之后就做一次内存整理 这个内存整理也是会触发stw停止所有线程一段时间
-XX:+CMSParallelInitialMarkEnabled cms初始标记阶段开启多线程标记默认是开启cpu的核心数
-XX:+CMSScavengeBeforeRemark 在CMS 重新标记阶段前启动一次ygc
-XX:+disableExplicitGC 禁止显式执行GC避免代码中的System.gc()
-XX:+HeapDumpOnOutOfMemoryError 开启堆内存溢出时的快照
-XX:HeapDumpPath=D:\test\dump\test.hprof 快照存放位置
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。