深入了解JVM
堆的内存划分堆分为新生代和老年代新生代占三分之一老年代占三分之二新生代又分成Eden和两个Survivor两个区比例为811新对象优先在Eden区分配满了就会触发Minor GC存活的放到幸存区两个幸存区轮流用每熬过一次GC年龄加1年龄到15或者幸存区放不下了就晋升到老年代老年代满了就触发FULL GC为什么新生代默认用811的比例因为根据统计新生代中的90%以上的对象活不过第一次GC意味着每次Minor GC只需要预留10%给存活对象就够了这个比例就是在空间利用率和晋升老年代的风险之间取得平衡可以通过-XX:SurvivorRatio调整为什么要熬过15次GC不是必须15次而是最多15次jvm对象头中用于记录分代年龄的字段只有4个bit位这个参数可以进行配置--XX:MaxTenuringThreshold说说一下JVM类加载器分类与核心功能类加载器是JVM用来把.Class文件加载到内存转化成Class对象的组件java里有如下几类加载器启动类加载器负责加载JAVA_HOME/lib下的核心库如rt.jar扩展类加载器JDK9之后改为平台类加载器负责加载JAVA_HOME/lib/ext下的扩展库应用程序类加载器负责加载ClassPath下的类库包括业务代码和第三方JAR包自定义加载器负责加载用户自定义路径下的类包通过继承ClassLoader类并重写findClass方法可以自定义类加载器典型场景比如Tomcat的WebAppClassLoaderOSGi的模块隔离Java 中的强引用、软引用、弱引用和虚引用分别是什么强引用 Object obj new object()就是强引用只要存在GC永远不会回收即使OOM软引用通过SoftReference包装的引用内存够用的时候不会受内存吃紧快要OOM是才回收弱引用通过WeakReference包装的引用只要GC那么就会回收虚引用唯一的用途是监控对象什么时候被回收JVM的TLAB是什么TLAB是JVM给每个线程划分的一小块私有堆内存专门用于加速对象分配不用和别的线程枪锁提高了分配效率。线程分配时优先从子的TLAB拿内存不够的话从Eden区申请新的如果对象太大就直接在Eden区装配绕过TLAB。存在内存碎片化问题比如生了8字节但下一个对象要16字节这时候得申请新的TLAB,那老的TLAB里的8字节就浪费了HotSpot的处理方式是用一个填充对象将此填满不填的话堆在线性遍历时遇到此空洞就会断
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2412441.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!