标签:静态 googl order 支持 状态 pil 并且 大小 保留
本章主要介绍计算机的一些基础资源以及操作系统处理后的一些基础资源。
主要包括
本章会介绍这些资源的一些原理,介绍如何查看资源的数量,使用情况,对性能和整体计算机执行的一些影响。
本章很多内容都基于linux,不是特殊说明,就是针对linux的情况。可能在其它操作系统不一定适用。
另外还会对jvm之上的一些内容做特殊说明,因为大家很大的一些积累都在jvm之上,内部的系统基本也建立在jvm上。
cpu是计算机里最重要的资源,没有之一,并且在性能优化领域,也是最需要理解的内容。
在代码执行方面,cpu执行代码的最终指令,调度资源,操作内存,对完成一个任务的各个方面都有较大影响。
首先,在linux中查看cpu信息的基础指令是看cpu的硬件信息
cat /proc/cpuinfoo
可以看到cpu的核数,单核的频率,以及cpu支持的一些特性。
另外一个最多接触到的内容是 load average 三联组,在很多命令中都会体现,w,top,uptime等等。
分别表示最近1,5,15分钟的cpu使用压力。
关于cpu的使用%比,和cpu load,是两个相似又有不同的概念,在linux里,cpu%也有不同的解释,具体不同,见下方解释。
cpu使用%
load
内存管理
这里主要介绍java虚拟机内部的内存管理。
jvm相关的内存主要分为以下几个部分
关键部分堆,按照现在的流行用法又分为
通过java参数,-Xmn可以调整新生代和老年代的大小
-XX:SurvivorRatio 可以调整Eden和S0S1的大小 S1=S0=mn/(SurvivorRatio+2)
-XX:MaxTenuringThreshold 对象在新生代存活的次数
-XX:MaxPermSize 可以调整perm区的大小
-Xss 可以调整方法栈的大小
-XX:MaxDirectMemorySize 可以调整Native Memory的大小
对象在Eden和s0以及老年代的存活一般策略,有例外。
从使用上来说,最满意的方式是,经过几轮往old区晋升后,old区趋于不变。old区可以存放一些类似于缓存对象等等,容器相关对象等需要长期生存的对象。
Eden区和S0区够大,对象在新生代的存活时间不超过MaxTenuringThreshold。
基本做法,从开始就把对象往2个方向设计,是长期存活,或者短期存活。
合理设计新老生代大小。
对内存的优化,其实主要也体现在对cpu时间使用上,包含对象创建,老对象地址查找,对象垃圾收集,我们能做的是尽量少的创建对象,以及尽量少的垃圾收集,对于老对象地址的查找,暂时没有太多方法。
内存泄露
内存泄露,主要涉及到垃圾收集方法,现在流行的方法,是通过一些gcroot,来查找所有在用的对象,保存下来,其它对象都gc掉。
一般的gcroot有以下一些类型的对象
如果有对象和这些相关的内容一直没有脱开关系,就有可能造成内存溢出。
一些典型的案例
需要区分对待内存溢出和内存使用过快,以及相关的转化过程
查看配置的主要方式
通过以下命令,可以看到你想要的配置,如果有其它参数在线上有配置的,直接加上参数。
java -server -Xmx128m -XX:+PrintFlagsFinal | grep MaxHeapSize
java的代码在编译成class之后,就变成了jvm可以认识的特定格式了,具体格式,大家可以参考jvm虚拟机规范。
最近的几个版本,可以在这里拿到,这个地址上也包好java语言的规范,2者的区别是,一个是介绍如何编写java虚拟机的,一个是介绍如何编写java代码的。
http://docs.oracle.com/javase/specs/
抛开jit,java就是针对jvm指令,一步一步执行的。
jvm对编译前的语言没有任何要求,所有现在有很多基于jvm的其它语法的语言,如scala,groovy,jruby等等。
而asm就是一套认识jvm指令,或者说是class文件格式的工具。
jvm在加载class的时候,提供了某些功能,可以让人为修改class对象,或者说是修改class最终加载到jvm的字节流。
通过asm对class字节流的修改,修改了class实际执行的行为,而达到我们的目的。
一些简单的例子
《~~~后续更精彩~~~》
标签:静态 googl order 支持 状态 pil 并且 大小 保留
原文地址:http://www.cnblogs.com/bqcoder/p/6237058.html