//锐角三角函数公式
sin α=∠α的对边 / 斜边
cos α=∠α的邻边 / 斜边
tan α=∠α的对边 / ∠α的邻边
cot α=∠α的邻边 / ∠α的对边
倍角公式
Sin2A=2SinA?CosA
Cos2A=CosA^2-SinA^2=1-2SinA^2=2CosA^2-1
tan2A=(2tanA)/(1-tanA^2)
(注:SinA^2 是sinA的平方 sin2(A) )
三倍角公式
sin3α=4sinα·sin(π/3+α)sin(π/3-α)
cos3α=4cosα·cos(π/3+α)cos(π/3-α)
tan3a = tan a · tan(π/3+a)· tan(π/3-a)
三倍角公式推导
sin3a
=sin(2a+a)
=sin2acosa+cos2asina
辅助角公式
Asinα+Bcosα=(A^2+B^2)^(1/2)sin(α+t),其中
sint=B/(A^2+B^2)^(1/2)
cost=A/(A^2+B^2)^(1/2)
tant=B/A
Asinα+Bcosα=(A^2+B^2)^(1/2)cos(α-t),tant=A/B
降幂公式
sin^2(α)=(1-cos(2α))/2=versin(2α)/2
cos^2(α)=(1+cos(2α))/2=covers(2α)/2
tan^2(α)=(1-cos(2α))/(1+cos(2α))
推导公式
tanα+cotα=2/sin2α
tanα-cotα=-2cot2α
1+cos2α=2cos^2α
1-cos2α=2sin^2α
1+sinα=(sinα/2+cosα/2)^2
=2sina(1-sin²a)+(1-2sin²a)sina
=3sina-4sin³a
cos3a
=cos(2a+a)
=cos2acosa-sin2asina
=(2cos²a-1)cosa-2(1-sin²a)cosa
=4cos³a-3cosa
sin3a=3sina-4sin³a
=4sina(3/4-sin²a)
=4sina[(√3/2)²-sin²a]
=4sina(sin²60°-sin²a)
=4sina(sin60°+sina)(sin60°-sina)
=4sina*2sin[(60+a)/2]cos[(60°-a)/2]*2sin[(60°-a)/2]cos[(60°-a)/2]
=4sinasin(60°+a)sin(60°-a)
cos3a=4cos³a-3cosa
=4cosa(cos²a-3/4)
=4cosa[cos²a-(√3/2)²]
=4cosa(cos²a-cos²30°)
=4cosa(cosa+cos30°)(cosa-cos30°)
=4cosa*2cos[(a+30°)/2]cos[(a-30°)/2]*{-2sin[(a+30°)/2]sin[(a-30°)/2]}
=-4cosasin(a+30°)sin(a-30°)
=-4cosasin[90°-(60°-a)]sin[-90°+(60°+a)]
=-4cosacos(60°-a)[-cos(60°+a)]
=4cosacos(60°-a)cos(60°+a)
上述两式相比可得
tan3a=tanatan(60°-a)tan(60°+a)
半角公式
tan(A/2)=(1-cosA)/sinA=sinA/(1+cosA);
cot(A/2)=sinA/(1-cosA)=(1+cosA)/sinA.
sin^2(a/2)=(1-cos(a))/2
cos^2(a/2)=(1+cos(a))/2
tan(a/2)=(1-cos(a))/sin(a)=sin(a)/(1+cos(a))
三角和
sin(α+β+γ)=sinα·cosβ·cosγ+cosα·sinβ·cosγ+cosα·cosβ·sinγ-sinα·sinβ·sinγ
cos(α+β+γ)=cosα·cosβ·cosγ-cosα·sinβ·sinγ-sinα·cosβ·sinγ-sinα·sinβ·cosγ
tan(α+β+γ)=(tanα+tanβ+tanγ-tanα·tanβ·tanγ)/(1-tanα·tanβ-tanβ·tanγ-tanγ·tanα)
两角和差
cos(α+β)=cosα·cosβ-sinα·sinβ
cos(α-β)=cosα·cosβ+sinα·sinβ
sin(α±β)=sinα·cosβ±cosα·sinβ
tan(α+β)=(tanα+tanβ)/(1-tanα·tanβ)
tan(α-β)=(tanα-tanβ)/(1+tanα·tanβ)
和差化积
sinθ+sinφ = 2 sin[(θ+φ)/2] cos[(θ-φ)/2]
sinθ-sinφ = 2 cos[(θ+φ)/2] sin[(θ-φ)/2]
cosθ+cosφ = 2 cos[(θ+φ)/2] cos[(θ-φ)/2]
cosθ-cosφ = -2 sin[(θ+φ)/2] sin[(θ-φ)/2]
tanA+tanB=sin(A+B)/cosAcosB=tan(A+B)(1-tanAtanB)
tanA-tanB=sin(A-B)/cosAcosB=tan(A-B)(1+tanAtanB)
积化和差
sinαsinβ = [cos(α-β)-cos(α+β)] /2
cosαcosβ = [cos(α+β)+cos(α-β)]/2
sinαcosβ = [sin(α+β)+sin(α-β)]/2
cosαsinβ = [sin(α+β)-sin(α-β)]/2
诱导公式
sin(-α) = -sinα
cos(-α) = cosα
tan (—a)=-tanα
sin(π/2-α) = cosα
cos(π/2-α) = sinα
sin(π/2+α) = cosα
cos(π/2+α) = -sinα
sin(π-α) = sinα
cos(π-α) = -cosα
sin(π+α) = -sinα
cos(π+α) = -cosα
tanA= sinA/cosA
tan(π/2+α)=-cotα
tan(π/2-α)=cotα
tan(π-α)=-tanα
tan(π+α)=tanα
诱导公式记背诀窍:奇变偶不变,符号看象限
万能公式
sinα=2tan(α/2)/[1+tan^(α/2)]
cosα=[1-tan^(α/2)]/1+tan^(α/2)]
tanα=2tan(α/2)/[1-tan^(α/2)]
其它公式
(1)(sinα)^2+(cosα)^2=1
(2)1+(tanα)^2=(secα)^2
(3)1+(cotα)^2=(cscα)^2
证明下面两式,只需将一式,左右同除(sinα)^2,第二个除(cosα)^2即可
(4)对于任意非直角三角形,总有
tanA+tanB+tanC=tanAtanBtanC
证:
A+B=π-C
tan(A+B)=tan(π-C)
(tanA+tanB)/(1-tanAtanB)=(tanπ-tanC)/(1+tanπtanC)
整理可得
tanA+tanB+tanC=tanAtanBtanC
得证
同样可以得证,当x+y+z=nπ(n∈Z)时,该关系式也成立
由tanA+tanB+tanC=tanAtanBtanC可得出以下结论
(5)cotAcotB+cotAcotC+cotBcotC=1
(6)cot(A/2)+cot(B/2)+cot(C/2)=cot(A/2)cot(B/2)cot(C/2)
(7)(cosA)^2+(cosB)^2+(cosC)^2=1-2cosAcosBcosC
(8)(sinA)^2+(sinB)^2+(sinC)^2=2+2cosAcosBcosC
(9)sinα+sin(α+2π/n)+sin(α+2π*2/n)+sin(α+2π*3/n)+……+sin[α+2π*(n-1)/n]=0
cosα+cos(α+2π/n)+cos(α+2π*2/n)+cos(α+2π*3/n)+……+cos[α+2π*(n-1)/n]=0 以及
sin^2(α)+sin^2(α-2π/3)+sin^2(α+2π/3)=3/2
tanAtanBtan(A+B)+tanA+tanB-tan(A+B)=0
一.JVM内存的设置的原理
默认的java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError。设置jvm内存的方法,对于单独的.class,可以用下面的方法对Test运行时的jvm内存进行设置。
java -Xms64m -Xmx256m Test
-Xms是设置内存初始化的大小
-Xmx是设置最大能够使用内存的大小(最好不要超过物理内存大小)
在weblogic中,可以在startweblogic.cmd中对每个domain虚拟内存的大小进行设置,默认的设置是在commEnv.cmd里面。
-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=64M
-XX:MaxPermSize=128M
下面是这几个设置的一些背景知识:
堆(Heap)和非堆(Non-heap)内存
按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给 自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法 的代码都在非堆内存中。
堆内存分配
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最 大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时, JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
非堆内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
JVM内存限制(最大值)
首先JVM内存首先受限于实际的最大物理内存,假设物理内存无限 大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是 2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了
JVM内存的调优
1. Heap设定与垃圾回收
Java Heap分为3个区,Young,Old和Permanent。Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象,本文不讨论该区。JVM的Heap分配可以使用-X参数设定,
- -Xms 初始Heap大小
- -Xmx java heap最大值
- -Xmn young generation的heap大小
JVM有2个GC线程。第一个线程负责回收Heap的Young区。第二个线程在Heap不足时,遍历Heap,将Young 区升级为Older区。Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。
为什么一些程序频繁发生GC?有如下原因:
- 程序内调用了System.gc()或Runtime.gc()
- 一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC
- Java的Heap太小,一般默认的Heap值都很小
- 频繁实例化对象,Release对象。此时尽量保存并重用对象,例如使用StringBuffer()和String()
如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态。许多Server端的Java程序每次GC后最好能有65%的剩余空间。经验之谈:
- Server端JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/3
- 一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成
注意:
- 增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作
- Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等
2.Stack的设定
每个线程都有他自己的Stack。
-Xss 每个线程的Stack大小
Stack的大小限制着线程的数量。如果Stack过大就好导致内存溢漏。-Xss参数决定Stack大小,例如-Xss1024K。如果Stack太小,也会导致Stack溢漏。
3.硬件环境</p>
硬件环境也影响GC的效率,例如机器的种类,内存,swap空间,和CPU的数量。
如果你的程序需要频繁创建很多transient对象,会导致JVM频繁GC。这种情况你可以增加机器的内存,来减少Swap空间的使用[2]。
4.4种GC
第一种为单线程GC,也是默认的GC。,该GC适用于单CPU机器。
第二种为Throughput GC,是多线程的GC,适用于多CPU,使用大量线程的程序。第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程。-XX:+UseParallelGC参数启动该GC。
第三种为Concurrent Low Pause GC,类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。
第四种为Incremental Low Pause GC,适用于要求缩短因GC造成程序停滞的时间。这种GC可以在Young区回收的同时,回收一部分Old区对象。-Xincgc参数启动该GC。
4种GC的具体描述参见[3]。
参考文章:
1. JVM Tuning. http://www.caucho.com/resin-3.0/performance/jvm-tuning.xtp#garbage-collection
2. Performance tuning Java: Tuning steps
3. Tuning Garbage Collection with the 1.4.2 JavaTM Virtual Machine .
http://java.sun.com/docs/hotspot/gc1.4.2/
二.Tomcat配置
问题分析:
由于TOMCAT内存溢出而引发的问题,主要原因是JVM的虚拟内存默认为128M,当超过这个值时就把先前占用的内存释放,而导致好象TCP/IP丢包的假象,出现HTTP500的错误。解决方法主要是加大TOMCAT可利用内存,并在程序当中加大内存使用。
解决方法:
方法:加大TOMCAT可利用内存:
在TOMCAT的目录下,也就是在TOMCAT41/bin/catalina.bat文件最前面加入
set JAVA_OPTS=-Xms800m -Xmx800m
表现效果是当你启动TOMCAT时,系统内存会增加近800M使用
操作方法:
- 先关掉WINDOWS服务当中的TOMCAT4服务
- 再找到TOMCAT/BIN目录下startup.bat,双击打开它,你会发现现WINDOWS内存占用会增加近800M
- 执行程序,因为是TOMCAT重新编译程序,所以第一次会比较慢
结论:
经过测试,我们得出如下数据:
当系统传输约2000条数据时,大约近12M的净数据(不压缩时),系统辅助运行的内存大约占用150M左右的空间,也就是近200M的内存占用,而我们扩大了近800M的JAVA内存使用,这对于业务本身来说是足够了。所以你们不用担心大数据量的传递问题。
基于JAVA虚拟机的原理,JAVA自动有垃圾回收机制,也就是在你对一些内存长时间不使用时(近2分钟,取决于使用频度和优先级等),就会自动垃圾回收,从而释放不用的内存占用。
三.WebLogic配置:
由于WebLogic的配置问题,我们的测试出现了失败情况。原因是为WebLogic分配的内存太少了。通过修改commom\bin\commEnv.cmd文件来增加内存分配。
修改的部分如下:
:bea
if "%PRODUCTION_MODE%" == "true" goto bea_prod_mode
set JAVA_VM=-jrockit
set MEM_ARGS=-Xms768m -Xmx1024m
set JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none
goto continue
:bea_prod_mode
set JAVA_VM=-jrockit
set MEM_ARGS=-Xms768m -Xmx1024m//原来是128M~256M,太小了,数据太大
goto continue
结果修改后,没有效果。还是有失败的情况。
发现,原来,在:bea下面还有一段配置信息如下:
:sun
if "%PRODUCTION_MODE%" == "true" goto sun_prod_mode
set JAVA_VM=-client
set MEM_ARGS=-Xms768m -Xmx1024m -XX:MaxPermSize=256m
set JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none
goto continue
:sun_prod_mode
set JAVA_VM=-server
set MEM_ARGS=-Xms768m -Xmx1024m -XX:MaxPermSize=256m
goto continue
将这里的内存分配修改后见效。
原因是,上面对第一段代码是为bea自己的JVM设置的,下面的是为Sun的设置的。而WebLogic默认的是Sun的,所以出了毛病。在JDK的选择上,weblogic有两种JDK供选择,一种是Sun的JDK,另外一种是Bea的jrockit。按照bea的网站的说明,sun jdk提供更好的兼容性,而使用jrockit可以提供更好的性能。作为weblogic集群我全部采用jrockit作为JDK环境,以达到更高的性能。
在默认启动情况下,jrockit启动时为其窗口配置的内存大小比较小。注意weblogic的启动内存配置-Xms32m -Xmx256m,通过修改commEnv.sh可以修改这个参数,Xms表示启动开始分配的内存,Xmx表示最大能分配的内存,这里我们根据应用情况调整为-Xms1536m -Xmx1536m,这点需要根据自身测试情况和系统配置进行调整,经过周一晚的调试,我们目前应用比较合理的窗口内存大小为1536M(2G× 75%),通过top可以观察到测试中的内存反应,最合理的应该是恰好把物理内存用完。