解读JVM虚拟机( 二 )
- java方法区和堆一样 , 方法区是一块所有线程共享的内存区域 , 它保存系统的类信息 , 比如类的字段、方法、常量池等 。
- 方法区的大小决定了系统可以保存多少个类 , 如果系统定义太多的类 , 导致方法区溢出 。 虚拟机同样会抛出内存溢出错误 。 方法区可以理解为永久区(Perm)
- 在虚拟机运行的过程中 , 如果可以跟踪系统的运行状态 , 那么对于问题的故障排查会有一定的帮助 。
- 为此 , 虚拟机提供了一些跟踪系统状态的参数 , 使用给定的参数执行java虚拟机 , 就可以在系统运行时打印相关日志 , 用于分析实际问题 。 我们进行虚拟机参数配置 , 其实主要就是围绕着堆、栈、方法区进行配置 。
- -XX:+PrintGC 使用这个参数 , 虚拟机启动后 , 只要遇到GC就会打印日志 。
- -XX:+UseSerialGC 配置串行回收器
- -XX:+PrintGCDetails 可以查看详细信息 , 包括各个区的情况
- -Xms:设置java程序启动时初始堆大小
- -Xmx:设置java程序能获得的最大堆大小
- -Xmx20m -Xms5m -XX:+PrintCommandLineFlags : 可以将隐式或者显示传给虚拟机的参数输出
- 总结:在实际工作中 , 我们可以直接将初始的堆大小与最大堆大小设置相等 , 这样的好处是可以减少程序运行时的垃圾回收次数 , 从而提高性能 。
- 新生代的配置 -Xmn:可以设置新生代的大小 , 设置一个比较大的新生代会减少老年代的大小 , 这个参数对系统性能以及GC行为有很大的影响 , 新生代大小一般会设置整个堆空间的1/3到1/4左右 。
- -XX:SurvivorRatio:用来设置新生代中eden空间和from/to空间的比例 。 含义:-XX:SurvivorRatio=eden/from=eden/to
- 总结:不同的堆分布情况 , 对系统执行会产生一定的影响 , 在实际工作中 , 应该根据系统的特点做出合理的配置 , 基本策略:尽可能将对象预留在新生代 , 减少老年代的GC次数 。 除了可以设置新生代的绝对大小(-Xmn) , 还可以使用(-XX:NewRatio)设置新生代和老年代的比例:-XX:NewRatio=老年代/新生代
- 在java程序的运行过程中 , 如果堆空间不足 , 则会抛出内存溢出的错误(Out Of Menory)OOM , 一旦这类问题发生在生产环境 , 可能引起严重的业务中断 。
- java虚拟机提供了-XX:+HeapDumpOnOutOfMemoryError , 使用该参数可以在内存溢出时导出整个堆信息 , 与之配合使用的还有参数 ,-XX:HeapDumpPath , 可以设置导出堆的存放路径 。
- Java虚拟机提供了参数-Xss来指定线程的最大栈空间 , 整个参数也直接决定了函数可调用的最大深度 。
- 和java堆一样 , 方法区是一块所有线程共享的内存区域 , 它用于保存系统的类信息 , 方法区(永久区)可以保存多少信息可以对其进行配置 。
- 在默认情况下 , -XX:MaxPermSize为64MB , 如果系统运行时生产大量的类 , 就需要设置一个相对合适的方法区 , 以免出现永久区内存溢出的问题 。 -XX:PermSize=64M -XX:MaxPermSize=64M
- 直接内存也是java程序中非常重要的组成部分 , 特别是广泛用在NIO中 , 直接内存跳过了java堆 , 使java程序可以直接访问原生堆空间 , 因此在一定程度上加快了内存空间的访问速度 。 但是说直接内存一定就可以提高内存访问速度也不见得 , 具体情况具体分析 。
- 相关配置参数:-XX:MaxDirectMemorySize , 如果不设置默认值为最大堆空间 , 即-Xmx 。 直接内存使用达到上限时 , 就会触发垃圾回收 , 如果不能有效的释放空间 , 也会引起系统的OOM.
- 谈到垃圾回收(Garbage Collection , 简称GC),需要先澄清什么是垃圾 , 类比日常生活中的垃圾 , 我们会把他们丢入垃圾桶 , 然后倒掉 。
- GC中的垃圾 , 特指存于内存中、不会再被使用的对象 , 而回收就是相当于把垃圾“倒掉” 。 垃圾回收有很多种算法:如引用计数法、标记压缩法、复制算法、分代、分区的思想 。
- 引用计数法:这是个比较古老而经典的垃圾收集算法 , 其核心就是在对象被其他所引用时计数器加1 , 而当引用失效时则减1 , 但是这种方式有非常严重的问题:无法处理循环引用的情况、还有就是每次进行加减操作比较浪费系统性能 。 标记清除法:就是分为标记和清除俩个阶段进行处理内存中的对象 , 当然这种方式也有非常大的弊端 , 就是空间碎片问题 , 垃圾回收后的空间不是连续的 , 不连续的内存空间的工作效率要低于连续的内存空间 。
- 一图看懂!数字日照、新型智慧城市这样建(上篇)|政策解读 | 新型
- 发展|大数据解读世界互联网大会·互联网发展论坛!
- 设计|未来创意拒绝被垄断:欧拉共创成果深度解读!
- 《深入理解Java虚拟机》:对象创建、布局和访问全过程
- 秒懂JVM的垃圾回收机制
- 安卓面试必备的JVM虚拟机制详解,看完之后简历上多一个技能
- 超好用的UnixLinux 命令技巧 大神为你详细解读
- Redmi|Redmi Note 9全系解读,999到1599元,三款手机各有哪些区别?
- 《深入理解Java虚拟机》:锁优化
- 面试必问的JVM知识-JVM特性学习