java程序的运行机制详细分析

JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。

       Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。

1.为什么要使用Java虚拟机

       Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。

Java运行机制

Java程序的运行必须经过编写编译运行三个步骤。

编写是指在Java开发环境中进行程序代码的输入,最终形成后缀名为.java的Java源文件。

编译是指使用Java编译器对源文件进行错误排查的过程,编译后将生成后缀名为.class的字节码文件,这不像C语言那样最终生成可执行文件。

运行是指使用Java解释器将字节码文件翻译成机器代码,执行并显示结果。这一过程如图1.1所示。

1

阅读全文…

Linux System Monitorng 笔记

概念 : 性能优化就是找到系统处理中的瓶颈以及去除这些的过程

———————————————————————————————————-
如何查找出系统性能问题:                                          
                ___I/0应用型(Dbserver)
1.确定应用类型: |___
                   CPU(运算)应用型(例如:webserver,mailserver)

2.确定基准线统计 :建立一个用来比较的准线标准

———————————————————————————————————-
系统高负载的问题:
大量的页调入请求导致内存队列的拥塞
网卡的大吞吐量可能导致更多的 CPU开销
大量的CPU开销又会尝试更多的内存使用请求
大量来自内存的磁盘写请求可能导致更多的 CPU 以及 IO问题

……………………………………………….CPU………………………………………….

概念:
CPU 利用率  : 就是定义CPU 使用的百分比

User Time   : 在user space中被执行进程在CPU 开销时间百分比

System Time : 内核线程以及中断时间

Wait IO     : I/O 请求等待时间

Idle        : 空闲

———————————————————————————————————-

性能指标:

每次内核的上下文切换,资源被用于关闭在CPU寄存器中的线程和放置在队列中.系统中越多的上下文切换,在处理器的调度管理下,内核将得到更多的工作.

一个标准的Linux 内核可以运行50 至 50,000 的处理线程

当运行队列越来越巨大,进程线程将花费更多的时间获取被执行

系统 load 就是指在CPU 队列中有多少数目的线程,以及其中当前有多少进程线程数目被执行的组合.如果一个双核系统执行了2个线程,还有4个在运行队列中,则 load 应该为 6

Run Queues – 每个处理器应该运行队列不超过1-3 个线程

CPU Utiliation – 如果一个CPU 被充分使用,利用率分类之间均衡的比例应该是
65% – 70%  User Time
30% – 35%  System Time
0%  – 5%   Idle Time

阅读全文…

perl时间函数与日志分析脚本

#!/usr/bin/perl
#--------------------------------------#
# Script Name: AccessLog.pl            #
# Writer by : Tat                      #
# Create time: 2012-03-27              #
# Last update: 2012-03-30              #
# Ver: 0.1 beta                        #
#--------------------------------------#
use strict;
use warnings;
#----------数据统计变量----------------
my $sum = 0;          #总日志数量
my $code5 = 0;        #Http 500错误页
my $code2 = 0;        #Http 200页
my $tophome=0;        #进入主页数据
#----------条件匹配变量---------------
my $home = "/home.htm";        #进入主页匹配
#-------------时间涵数------------------
sub getTime(){
 (my $sec,my $min,my $hour,my $day,my $mon,my $year,
  my $weekday,my $yeardate,my $savinglightday) = (localtime(time-86400));#time-86400前一天
 $sec = ($sec < 10)? "0$sec":$sec;
 $min = ($min < 10)? "0$min":$min;
 $hour = ($hour < 10)? "0$hour":$hour;
 $day = ($day < 10)? "0$day":$day;
 $mon = ($mon < 9)? "0".($mon+1):($mon+1);
 $year += 1900;

 my $now = "$year-$mon-$day";
 return $now;
}
#------------其他变量-----------------
my $namemin=getTime();
my $filename="access.$namemin.log";
my $tmpfile="/tmp/access.log";
my $logfile=$tmpfile;

if(-e $tmpfile)
{
   system("rm $tmpfile");
}
system("find /logs/*/ -name $filename|xargs cat |
        awk \'{print \$1 \" \" \$2 \" \" \$3 \
               " \" \$6 \" \" \$10 \" \" \$12}\' >> $tmpfile");

open(INFILE,$logfile)||die "can't open ddns_log file $logfile: $!\n"; 

line: while(my $line=<INFILE>){
        $line =~ /^\[
                ([\d\w:\/]+)\s\+\d{4}\]         #Date matching
        \s+
        (\d+)                        #Http Status code matching
        \s+
        (\d+|-)                            #phone
        \s+
        (\w+)                              #Request type
        \s+
            (\/([^\s]*)|.*)                    #url
            $/ix or do
        {
        next line;

        };

    if ($2 >=500){
       $code5 ++;
    }
    if($2 == 200){
       $code2 ++;
    }
    if($4 eq "GET" && $5 eq $home){
      $top ++;
    }    

   $sum ++;
}

print "####################【日志统计】#####################\n";
print "总处理日志条数:: $sum\n";
print "页面50X代码条数:: $code5\n";
print "页面200代码条数 :: $code2\n";
print "##########################################################\n";
system("rm $tmpfile");

脚本是用来统计一个access日志用户行为的初本,由于考虑机密问题只放出初本供大家参考。

tomcat日志格式

pattern=”%t %s %T %b %{x-up-calling-line-id}i %{x-up-bear-type}i %a %{x-forwarded-for}i %m [%{HOST}i] %U%q [%{User-Agent}i] [%{Accept-Encoding}i]“

高仿快乐麻花源代码

程序采用DEDE5.7内核。
 整站打包,带安装教程。

在淘宝上买的,现在用不上,共享出来。

 

下载地址

 

AWK高级应用

  • $ awk ‘{print $3}’ test—–截取第三域(列)的内容。
  • $ awk ‘/^(no|so)/’ test—–打印所有以模式no或so开头的行。
  • $ awk ‘/^[ns]/{print $1}’ test—–如果记录以n或s开头,就打印这个记录。
  • $ awk ‘$1 ~/[0-9][0-9]$/(print $1}’ test—–如果第一个域以两个数字结束就打印这个记录。
  • $ awk ‘$1 == 100 || $2 < 50′ test—–如果第一个或等于100或者第二个域小于50,则打印该行。
  • $ awk ‘$1 != 10′ test—–如果第一个域不等于10就打印该行。
  • $ awk ‘/test/{print $1 + 10}’ test—–如果记录包含正则表达式test,则第一个域加10并打印出来。
  • $ awk ‘{print ($1 > 5 ? “ok “$1: “error”$1)}’ test—–如果第一个域大于5则打印问号后面的表达式值,否则打印冒号后面的表达式值。
  • $ awk ‘/^root/,/^mysql/’ test—-打印以正则表达式root开头的记录到以正则表达式mysql开头的记录范围内的所有记录。如果找到一个新的正则表达式root开头的记录,则继续打印直到下一个以正则表达式mysql开头的记录为止,或到文件末尾。

 awk编程

 变量

  • 在awk中,变量不需要定义就可以直接使用,变量类型可以是数字或字符串。
  • 赋值格式:Variable = expression,如$ awk ‘$1 ~/test/{count = $2 + $3; print count}’ test,上式的作用是,awk先扫描第一个域,一旦test匹配,就把第二个域的值加上第三个域的值,并把结果赋值给变量count,最后打印出来。
  • awk可以在命令行中给变量赋值,然后将这个变量传输给awk脚本。如$ awk -F: -f awkscript month=4 year=2004 test,上式的month和year都是自定义变量,分别被赋值为4和2004。在awk脚本中,这些变量使用起来就象是在脚本中建立的一样。注意,如果参数前面出现test,那么在BEGIN语句中的变量就不能被使用。
  • 域变量也可被赋值和修改,如$ awk ‘{$2 = 100 + $1; print }’ test,上式表示,如果第二个域不存在,awk将计算表达式100加$1的值,并将其赋值给$2,如果第二个域存在,则用表达式的值覆盖$2原来的值。再例如:$ awk ‘$1 == “root”{$1 =”test”;print}’ test,如果第一个域的值是“root”,则把它赋值为“test”,注意,字符串一定要用双引号。
  • 内建变量的使用。变量列表在前面已列出,现在举个例子说明一下。$ awk -F: ‘{IGNORECASE=1; $1 == “MARY”{print NR,$1,$2,$NF}’test,把IGNORECASE设为1代表忽略大小写,打印第一个域是mary的记录数、第一个域、第二个域和最后一个域。

 BEGIN模块

BEGIN模块后紧跟着动作块,这个动作块在awk处理任何输入文件之前执行。所以它可以在没有任何输入的情况下进行测试。它通常用来改变内建变量的值,如OFS,RS和FS等,以及打印标题。如:$ awk ‘BEGIN{FS=”:”; OFS=”\t”; ORS=”\n\n”}{print $1,$2,$3} test。上式表示,在处理输入文件以前,域分隔符(FS)被设为冒号,输出文件分隔符(OFS)被设置为制表符,输出记录分隔符(ORS)被设置为两个换行符。$ awk ‘BEGIN{print “TITLE TEST”}只打印标题。

 END模块

END不匹配任何的输入文件,但是执行动作块中的所有动作,它在整个输入文件处理完成后被执行。如$ awk ‘END{print “The number of records is” NR}’ test,上式将打印所有被处理的记录数。

阅读全文…

iptables防火墙简单介绍

关于防火墙的简单了解
    iptables防火墙是由Netfilter项目开发。iptables目前已发展成为一个功能强大的防火墙,可与专有的商业防火墙相媲美。
    iptables提供能了全面的协议状态跟踪,数据包的应用层检查,速率限制和一个功能强大的机制已制定过滤策略。
 
关于iptables和Netfilter之间的关系:
    Linux提供的所有包过滤和包修改设施的官方项目名称Netfilter,此术语也指linux内核里面的一个框架,可以用于在不同阶段将函数挂接(hook)进网络栈.简单的理解就是,Netfilter提供了一个框架,iptables在它之上建立了防火墙功能。
    linux的绝大多数功能都是以模块的形式扩充出来的,Netfilter也是以模块的形式存在于linux中,当linux多了一个Netfilter模块,linux防火墙功能也就多了一项。
    其实不仅是Netfilter有模块,iptables也有模块,这些模块就位于/lib64/xtables/(32bit系统在/lib/xtables/)目录下,其中以libxt开头的是iptables模块,这些模块与Netfilter模块是一一相对应的,例如/lib/modules/`uname -r`/kernel/net/netfilter/xt_conntrack.ko模块,在/lib64/xtables/libxt_conntrack.so与之相对应。当下达与xt_conntrack.ko相关的指令时,iptables会根据libxt_conntrack.so模块的指示去检查语法是否正确。并将Netfilter相应模块载入到系统内存,iptables最后将规则写入到规则数据库中。
    Netfilter本身并不对数据包进行过滤,它只是允许过滤的数据包的函数挂接的内核中合适的位置。Netfilter项目在内核中还提供了一些基础设施,比如链接跟踪和日志记录,任何iptables策略都可以使用这些设施来执行特定数据包的处理。
       
有关Netfilter的工作位置:
        Netfilter模块存放的目录:
            /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/
            /lib/modules/`uname -r`/kernel/net/ipv6/netfilter/
       以上两个目录中的模块都与协议有关,因此在使用时应该注意相应的协议
            /lib/modules/`uname -r/kernel/net/netfilter/
       经过Netfilter组织的努力与协议无关的模块就存放在上面的目录,可同时应用于ipv4和ipv6的网络环境
       链路层:根据链路层数据包包头的内容在防火墙中依规则进行过滤,例匹配MAC地址
       网络层:根据数据包IP包头的内容作为过滤条件,例如:IP包头的长度,协议….
       传输层:根据传输层包头的内容进行匹配,例如TCP包头的内容中的来源端端口号,目的端端口号,TCP包头的整体长度….

shell 删除文本中的重复行

三种常见方法:
第一,用sort+uniq,注意,单纯uniq是不行的。

shell> sort -k2n file | uniq > a.out

这里我做了个简单的测试,当file中的重复行不再一起的时候,uniq将服务删除所有的重复行。经过排序后,所有相同的行都在相邻,因此unqi可以正常删除重复行。

第二,用sort+awk命令,注意,单纯awk同样不行,原因同上。

shell> sort -k2n file | awk ‘{if ($0!=line) print;line=$0}’

当然,自己把管道后面的代码重新设计一下,可能不需要sort命令先排序拉。

第三,用sort+sed命令,同样需要sort命令先排序。

shell> sort -k2n file | sed ‘$!N; /^\(.*\)\n\1$/!P; D’

最后附一个必须先用sort排序的文本的例子,当然,这个需要用sort排序的原因是很简单,就是后面算法设计的时候的“局部性”,相同的行可能分散出现在不同的区域,一旦有新的相同行出现,那么前面的已经出现的记录就被覆盖了,看了这个例子就好理解拉。

ffffffffffffffffff
ffffffffffffffffff
eeeeeeeeeeeeeeeeeeee
fffffffffffffffffff
eeeeeeeeeeeeeeeeeeee
eeeeeeeeeeeeeeeeeeee
gggggggggggggggggggg

其实,这是我随便打进去的几行字,没想到就是必须用sort的很好例子,大家可以自己试试看。

阅读全文…

优化TCP内核参数提高服务器并发

在服务器硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题。要提高linux系统下的负载能力,可以使用nginx等原生并发处理能力就很强的web服务器,如果使用Apache的可以启用其Worker模式,来提高其并发处理能力。除此之外,在考虑节省成本的情况下,可以修改linux的内核相关TCP参数,来最大的提高服务器性能。当然,最基础的提高负载问题,还是升级服务器硬件了,这是最根本的。

Linux系统下,TCP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将TIME_WAIT状态的端口清理掉。

本文介绍的方法只对拥有大量TIME_WAIT状态的连接导致系统资源消耗有效,如果不是这种情况下,效果可能不明显。可以使用netstat命令去查TIME_WAIT状态的连接状态,输入下面的组合命令,查看当前TCP连接的状态和对应的连接数量:

netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

这个命令会输出类似下面的结果:

LAST_ACK 16

SYN_RECV 348

ESTABLISHED 70

FIN_WAIT1 229

FIN_WAIT2 30

CLOSING 33

TIME_WAIT 18098

阅读全文…