分类归档:实践总结

JVM内存管理详解

JVM内存结构

JVM在运行java程序时将运行时数据划分成几种不同格式的数据,分别存储在不同的区域里,这些数据又统一称为运行时数据,而java虚拟机规范又将java运行时数据划分为以下6种.

  • pc寄存器
  • 严格来说这是一种数据结构,它用于保存当前正常执行的程序的内存地址,同时java程序是多线程执行的,所以需要一个记录员记录下每一个线程执行到哪一条指令.

  • 栈区
  • 栈总是和线程关联在一起的,每创建一个线程jvm就会为这个线程创建一个对应的java栈,而每个java栈中又会有多个栈帧,另外有一点需要注意,java栈与java线程是对应起来的,这个数据不是线程共享的,所以我们不用关心它的数据一致性.

  • 堆区
  • 堆区是存放java对象的地方,也是开发人员最应该关注的区域,堆区中所有对象都被线程共享,访问时需要关注线程同步问题.

  • 方法区
  • 方法区是存放类结构的地方,当class被加载到jvm时会被存放在不同的数据结构中,而其常量,域,方法数据,方法体,构造函数等都存放在此区域.

  • 运行时常量
  • 包括存放编译期数字常量,方法或者域引用,它是方法区一部分,其存储也受方法区规范约束,如果常量池无法分配,也会出现OOM异常.

  • 本地方法栈
  • 本地方法栈是为jvm运行native方法准备的空间,由于很多native方法使用c实现,所以也可以称作c栈.

阅读全文…

SpringMVC跨域乱码问题

最近的工作重点转移至web开发,使用框架主要还是spring mvc, jackson, jQuery,但在开发中又遭遇了n年前的跨域问题,jsonp乱码问题,其实这些问题产生原因很简单,但实际上解决起来却需要了解各种机制运行内幕.

解决方案

  • 在web.xml中设置CharacterEncodingFilter,相信绝大多数乱码问题均可以解决,这其中的原理不用再讲解,毕竟这个filter的代码非常简单.

  • 阅读全文…

RTMP协议握手详解

RTMP协议介绍

Real Time Messaging Protocol(实时消息传送协议协议)是Adobe Systems公司为Flash Player和服务器之间音频,视频和数据传输开发的私有协议,adobe目前提供了一个并不完整的rtmp specification给大众使用,所以在使用rtmp协议时需要按flash player返回的包进行解析.
目前rtmp有以下几个变种:

  • rtmp是工作在TCP之上的明文协议,默认使用1935端口
  • rtmps是rtmp使用TLS/SSL连接
  • rtmpe是adobe使用自己的加密机制对rtmp进行加密的,虽然加密机制是使用了行业标准,并且内部实现也是专有的,但rtmpe设计基本上错误的,它本身也不提供任何的安全性.
  • rtmpt是对rtmp协议提供了一个http的封装,主要是为了防止防火墙对其进行拦截.

包结构

  • rtmp消息包使用的是二进制数据流,它们使用AMF0/AMF3进行编码.与其它协议一样,rtmp消息也是也包括消息头与消息体,而消息头又可以分为basic header,chunk header,timestamp.
  • basic header是此包的唯一不变的部分,并且由一个独立的byte构成,这其中包括了2个作重要的标志位,chunk type以及stream id.chunk type决定了消息头的编码格式,该字段的长度完全依赖于stream id,stream id是一个可变长的字段.
  • message header该字段包含了将要发送的消息的信息(或者是一部分,一个消息拆成多个chunk的情况下是一部分)该字段的长度由chunk basic header中的trunk type决定.
  • timestamp扩展时间戳就比较好理解的,就是当chunk message header的时间戳大于等于0xffffff的时候chunk message header后面的四个字节就代表扩展时间.

阅读全文…

JVM参数大全

阅读全文…

JVM参数
-Xms 设置JVM初始化堆内存大小
-Xmx 设置JVM最大的堆内存大小
-Xss 设置JVM栈内存大小
-Xmn 设置young generation的堆内存大小,一般设置为Xmx的1/3
-Xmixed 混合模式执行
-Xint 解释模式执行
-Xbootclasspath: 设置zip/jar资源或者类(.class文件)存放目录路径
-Xbootclasspath/a: 追加zip/jar资源或者类(.class文件)存放目录路径
-Xbootclasspath/p: 预先加载zip/jar资源或者类(.class文件)存放目录路径
-Xnoclassgc 关闭类垃圾回收功能
-Xincgc 开启类的垃圾回收功能
-Xloggc: 记录垃圾回日志到一个文件
-Xbatch 关闭后台编译
-Xprof 输入CPU概要表数据
-Xfuture 执行严格的代码检查,预测可能出现的情况
-Xrs 通过JVM还原操作系统信号
-Xcheck:jni 对JNI函数执行检查
-Xshare:off 尽可能不去使用共享类的数据
-Xshare:auto 尽可能的使用共享类的数据
-Xshare:on 尽可能的使用共享类的数据,否则运行失败
非稳态选项使用说明
-XX:+<option> 启用选项
-XX:-<option> 不启用选项
-XX:+<option>=-<number> 给选项设置一个数字类型值,可跟单位,例如 32k,1024m,2g
-XX:+<option>=-<string> 给选项设置一个字符串值,例如-XX:HeapDumpPath=./dump.core

Memcached CAS详解

什么是cas

Memcached于1.2.4版本新增CAS协议,类同于Java并发包中CAS(Compare and Set)原子操作,用来处理同一item被多个线程更改过程的并发问题.

基本原理

基本原理非常简单,简而言之就是”版本号”.每个存储的数据对象都有一个版本号.在Memcached中,每个key关联有一个64bit长度的long型唯一数值,表示该key对应value的版本号.
这个数值由Memcached产生,从1开始,且同一Memcached不会重复,在两种情况下这个版本数值会加,即新增与更新,而删除item版本值不会减小.
阅读全文…