# learn-jvm **Repository Path**: diuse/learn-jvm ## Basic Information - **Project Name**: learn-jvm - **Description**: 学习jvm - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2016-07-09 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #learn-jvm ##这个项目的目的 为了学习各个jvm中内存分配以及调整jvm参数对性能的影响。每种溢出都会有一个类来模拟,标注出jvm运行的参数。 ##jvm中内存分区 1. 静态区 * 常量区(存在常量的位置,在类中用了final修饰的属性,String.intern()也会这样子) * 方法区 2. 堆 * 新生代(小gc) * 老生代(大gc) 3. 栈 * 线程栈 * 方法栈 4. 直接内存 ## jvm启动参数配置 * Xms256m 堆最小的可用容量 * Xmx1024m 堆最大可用的容量 * Xss128K 每个线程的栈大小,默认是1M (线程内部的方法调用栈也在这里申请,递归深度太大就会出现SOF) * Xmn 堆中新生代的容量,一般设置为整个堆空间的1/4~1/3,其余的就是老生代。Xmn空间越大,一次小gc需要的时间也就越长,大gc的次数就会降低 * XX:MaxPermSize=96m 最大的方法区的容量, 决定了系统中能加载了class,使用字节码增加的技术这里溢出的可能性会比较大。 * Xss 线程栈 * XX:+DisableExplicitGC 忽略代码中的显示GC,即System.gc(); * XX:+UseParNewGC 使用CMS作为默认新生代的回收期 * XX:+UseConcMaskSweepGC 使用CMS * XX:SurvivorRatio 8 表示新生代Eden和Survivor(两个的总和)的比值 8的含义为Eden:Survivor:Survivor 为8:1:1 ## 调试的基本思路 * 如果是溢出,dump出来,查看关系(没搞过) * 如果响应缓慢,得看GC的时间,主要是大GC引起的,可能是新生代的太小了,也可能是GC的处理器设置的不对。