分类归档:语言学习

JVM GC问题排查手段

最近生产环境上出现过两次由于JVM参数设置不当导致的频繁FGC的问题,现在做个简单的记录.

  1. 首先查看GC日志,观察每次FGC的频率以及各个区的回收情况
  2. 然后再配合使用jstat与jmap查看是否有泄露问题,分析内存泄露最佳组合就是jamp dump + MAT,先dump内存,然后MAT分析来定位问题,要jmap -heap需要慎用,在用cms gc的情况下,有些时候jmap -heap会循环输出,然后就卡死了
  3. 最后使用jstack排查各线程的状态,包括用户线程和虚拟机线程,同时结合Lock信息来检测是否发生了死锁和死锁的线程.
    ​另外在用top -H看到占用CPU非常高的pid时,可以转换成16进制后在jstack dump出来的文件中搜索,看看到底是什么线程占用了CPU

总之,GC问题是一个需要不断跟进的问题,它会随着业务与技术发展而不断出现,需要用到很多方法与经验.

解决java调试工具无法连接jvm

今日对线上tomcat做jstack时发现如下异常

后来尝试不同的jdk版本发现tomcat在1.6.24版本以下的jmap,jstack都无法操作,而在1.6.18版本可以执行jmap,jstack.

原因分析

jvm运行时会生成一个目录hsperfdata_$USER($USER是启动java进程的用户),在linux中默认是/tmp,目录下会有些pid文件,存放jvm进程信息,而jmap,jstack等工具会读取/tmp/hsperfdata_$USER下的pid文件获取连接信息.
知道这个原因后,我马上检查了/tmp/hsperfdata_root目录,果然没有pid对应的文件,但在$TOMCAT_HOME目录中的temp目录中有对应的文件.
阅读全文…

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的代码非常简单.

  • 阅读全文…

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