java_jvm_参数及技巧

XXSurvivorRatio

其中S0 S1 又叫Surivivor 区间 垃圾回收的时候采用复制算法(把没用的删除有用的复制到S0或S1,达到15次后放入老年代)

-XXSurvivorRatio=3 代表eden=3
-Xmn5120M  意思新生代为5120M 即eden+s0+s1=5120’
因为-XXSurvivorRatio=3  代表eden=3
即 3+1+1=5120  所以eden=3072

老年代tenured

1.回收次数达到上限一般为15次 就将对象移到老年代
2.大对象(需要大量连续内存空间)直接进入老年代
3.新生代回收时采用复制算法  老年代采用整理和标记清除算法CMS,当某对象的引用数为0时,便可以进行垃圾收集

永久区(方法区)

1.永久区即方法区Perm 存放的是类 字段名 相当于模板吧 常量
String.intern() 也是放入了常量池 ,常量池会内存溢出的
2.永久区即方法区 是被线程共享的
-XX:PermSize 初始永久带内存
-XX:MaxPermSize 最大永久带内存

配制技巧

-Xms 堆的初始大小
-Xmx 堆的最大值
-Xmn 代表新生代的配制
-Xss  栈内存指定线程的最大空间
-XX:PermSize 初始永久带内存
-XX:MaxPermSize 最大永久带内存

技巧

1.堆的 初始化值 与 最大值设置成一致 以减少垃圾回收频率
2.新生代(eden+S0+S1) 设置成堆空间的 1/31/4

线程间通信

1. 首先,线程A把本地内存A中更新过的共享变量刷新到主内存中去。 
2. 然后,线程B到主内存中去读取线程A之前已更新过的共享变量

类加载顺序

先静态 先后父子
1,父类中的static代码块,当前类的static
2,顺序执行父类的普通代码块
3,父类的构造函数
4,子类普通代码块
5,子类(当前类)的构造函数,按顺序执行。
6,子类方法的执行,
还有更多的关于类加载顺序的面试题 连接

面试题

class C{ 
  public Object x; 
} 
C obj1、obj2 = new C(); 
obj1.x = obj2; 
obj2.x = obj1; 
obj1、obj2 = null; 
都不能被回收

obj1,obj2只是栈空间里的引用类型产量,他们置空了,但是堆空间里实际实际实例对象的属性x还持有对方的引用,所以两块实例对象并没有被回收。
指的是如果某个地方引用了这个对象就+1,如果失效了就-1,当为0就会回收但是JVM没有用这种方式,因为无法判定相互循环引用(A引用B,B引用A)的情况
引用链法: 通过一种GC ROOT的对象(方法区中静态变量引用的对象等-static变量)来判断,如果有一条链能够到达GC ROOT就说明,不能到达GC ROOT就说明可以回收

你可能感兴趣的:(java_jvm_参数及技巧)