
public static int add(int a,int b){
int c=0;
c = a+b;
return c;
}
0: iconst_0 //0压栈
1: istore_2 //弹出int,存放与局部变量2
2: iload_0 //把局部变量0压栈
3: iload_1 //局部变量1压栈
4: iadd //弹出2个变量,求和,结果压栈
5 istore_2 //弹出的结果防御局部变量2
6: iload_2 //局部变量2压栈
7: ireturn //返回
public class StackTest{
public static void call(){
byte[] b = new byte[10];
for(int i=0;i<b.length;i++){
b[i]=1;
}
}
public static void main(String[] args){
for(int i=0;i<1000000;i++){
call();
}
}
}
-Xmx10m -Xms10m -xx:+DoEscapeAnalysis -XX:+PrintGC
栈上分配对象,不需要回收,也就不启动GC
-Xmx10m -Xms10m -xx:-DoEscapeAnalysis -XX:+PrintGC
结果:打印GC
对中new对象时,需要结束后对对象删除,会启动GC回收,否则溢出
总结:

每一个线程都有一个工作内存和独立内存。
每一个操作都是院子的,即操作执行期间不会被中断。对于变量,一个线程中更新的指,不会马上反应到其他变量中。如果要在其他线程中立即可见需要使用volatile关键字。但volatile不能代替锁,一般任务volatile性能好(不绝对)切线程不安全。
-X:non-standard(非标准参数),这些参数不是虚拟机规范规定的。因此,不是所有的vm的实现都支持这些配置参数,例如:-Xms -Xmx -Xmn -Xss
-XX:not-stable(不稳定参数),这些参数时虚拟机规范中规定的。这些单数指定虚拟机实例在运行时的各种行为,从而对虚拟机的运行时性能有很大影响。如:-XX:SurvivorRatio -XX:+UseRarNewGc;
-X和-XX两种参数都可能随着JDK版本的变化而变更,这些参数可能会被废弃掉,有些参数的功能会发生改变,但是JDK官方不会通知开发者的这些变化,需要试着用者注意。




System.out.print("Xmx=");
System.out.println(Runtime.getRuntime().maxMemory()/1024/2014+"M");
System.out.print("free mem=");
System.out.println(Runtime.getRuntime().freeMemory()/1024/2014+"M");
System.out.print("total mem=);
System.out.println(Runtime.getRuntime().totalMemory()/1024/2014+"M");
Xmx = 19.3M
free mem=4.25M
total mem=4.875M
根据实际大小调整新生代和幸存代的大小:官方推荐新生代占2/8,幸存代占新生代的1/10。在OOM时,记得dump出栈,确保可以排查现场问题。
可统计系统的cpu 内存 swap io等情况
语法:vmstat [采样平率] [采样次数]
细致观察进程(监控CPU、IO、内存)
语法:pidstat -p [进程号]
参数:-u 1 3 -u监控cpu, -u 1 3 每1秒采集共三次 ,如 pidstat -p 1025 -u 1 3
参数:-t 显示线程,如 pidstat -p 1025 -u 1 3 -t
参数:-d 检查磁盘IO ,如 pidstat -p 1025 -u 1 3 -t -d
| 参数 | 示例 | 说明 |
|---|---|---|
| -q | jps -q | 只输出进程ID,不输出类名 |
| -m | jps -m | 输出传递给java进程(主函数)的参数 |
| -l | jps -m -l | 输出主函数的完成路径 |
| -v | jps -m -l -v | 显示传递给JVM的参数 |
| 参数 | 示例 | 说明 |
|---|---|---|
| -flag | jinfo -flag MaxTenuringThreshold 2250 输出:-XX:MaxTenuringThreshold=15 | 打印指定的jvm参数 |
| -flag name=value | jinfo -flag MaxTenuringThreshold=15 2250 | 设置jvm参数 |
| -flag ±name | jinfo -flag +PrintGCDetails 2250 | 设置jvm参数 |
jmap -histo 2250
jstack -l 打印锁信息
jstack -m 打印java和native的帧信息