JVM堆内存原理及参数设置

堆内存定义(白话版)

一个对象的一生:我是一个普通的Java对象,我出生在Eden区,在Eden区我还看到和我长的很像的小兄弟,我们在Eden区中玩了挺长时间。有一天Eden区中的人实在是太多了,我就被迫去了Survivor区的“From”区,自从去了Survivor区,我就开始漂了,有时候在Survivor的“From”区,有时候在Survivor的“To”区,居无定所。直到我18岁的时候,爸爸说我成人了,该去社会上闯闯了。于是我就去了年老代那边,年老代里,人很多,并且年龄都挺大的,我在这里也认识了很多人。在年老代里,我生活了20年(每次GC加一岁),然后被回收。

原理

JVM堆内存分为2块:Permanent Space 和 Heap Space。

  • Permanent 即 持久代(Permanent Generation),主要存放的是Java类定义信息,与垃圾收集器要收集的Java对象关系不大。
  • Heap = { Old + NEW = {Eden, from, to} },Old 即 年老代(Old Generation),New 即 年轻代(Young Generation)。年老代和年轻代的划分对垃圾收集影响比较大。
阅读全文 »

Java应用CPU使用率飙升的原因

背景

1、无限循环的while会导致CPU使用率飙升吗?
2、经常使用Young GC会导致CPU占用率飙升吗?
3、具有大量线程的应用程序的CPU使用率是否较高?
4、CPU使用率高的应用程序的线程数是多少?
5、处于BLOCKED状态的线程会导致CPU使用率飙升吗?
6、分时操作系统中的CPU是消耗 us还是 sy

思路

如何计算CPU使用率?

CPU%= 1 - idleTime / sysTime * 100

idleTime:CPU空闲的时间

sysTime:CPU处于用户模式和内核模式的时间总和

阅读全文 »

浅谈常见的七种加密算法及实现

背景

数字签名信息加密 是前后端开发都经常需要使用到的技术,应用场景包括了用户登入、交易、信息通讯、oauth 等等,不同的应用场景也会需要使用到不同的签名加密算法,或者需要搭配不一样的 签名加密算法 来达到业务目标。这里简单的给大家介绍几种常见的签名加密算法和一些典型场景下的应用。

正文

数字签名

数字签名,简单来说就是通过提供 可鉴别数字信息 验证 自身身份 的一种方式。一套 数字签名 通常定义两种 互补 的运算,一个用于 签名,另一个用于 验证。分别由 发送者 持有能够 代表自己身份私钥 (私钥不可泄露),由 接受者 持有与私钥对应的 公钥 ,能够在 接受 到来自发送者信息时用于 验证 其身份。

阅读全文 »

秒懂mycat

背景

阿里开源的一个数据库中间件,专门为大数据量的项目做分库分表用的。有如下特点:

  • 一个彻底开源的,面向企业应用开发的大数据库集群

  • 支持事务、ACID、可以替代MySQL的加强版数据库

  • 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群

  • 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server

  • 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

  • 一个新颖的数据库中间件产品

官网地址: http://www.mycat.org.cn/

mycat权威指南: http://www.mycat.org.cn/document/mycat-definitive-guide.pdf

mycat架构

话不多说,一张mycat架构图就能让你知道mycat的角色以及作用。

mycat1.6版本架构如下:

由图可知,mycat位于数据库和应用层(APP)之间,它的角色就是帮我们管理数据库集群,而提供应用统一访问数据库接口。

阅读全文 »

Java应用线上排查总结

背景

本文总结了一些常见的线上应急现象和对应排查步骤和工具。分享的主要目的是想让对线上问题接触少的同学有个预先认知,免得在遇到实际问题时手忙脚乱。毕竟作者自己也是从手忙脚乱时走过来的。

只不过这里先提示一下。在线上应急过程中要记住,只有一个总体目标:尽快恢复服务,消除影响。 不管处于应急的哪个阶段,我们首先必须想到的是恢复问题,恢复问题不一定能够定位问题,也不一定有完美的解决方案,也许是通过经验判断,也许是预设开关等,但都可能让我们达到快速恢复的目的,然后保留部分现场,再去定位问题、解决问题和复盘

在大多数情况下,我们都是先优先恢复服务,保留下当时的异常信息(内存dump、线程dump、gc log等等,在紧急情况下甚至可以不用保留,等到事后去复现),等到服务正常,再去复盘问题。

好,现在让我们进入正题吧。

CPU 利用率高/飙升

场景预设:

监控系统突然告警,提示服务器负载异常。

预先说明:

CPU飙升只是一种现象,其中具体的问题可能有很多种,这里只是借这个现象切入。

注:CPU使用率是衡量系统繁忙程度的重要指标。但是CPU使用率的安全阈值是相对的,取决于你的系统的IO密集型还是计算密集型。一般计算密集型应用CPU使用率偏高load偏低,IO密集型相反。

阅读全文 »

使用jstack和jmap分析线上故障

背景

下面是线上机器的cpu使用率,可以看到从4月8日开始,随着时间cpu使用率在逐步增高,最终使用率达到100%导致线上服务不可用,后面重启了机器后恢复。

操作步骤

1、排查思路

简单分析下可能出问题的地方,分为5个方向:

  • 系统本身代码问题

  • 内部下游系统的问题导致的雪崩效应

  • 上游系统调用量突增

  • http请求第三方的问题

  • 机器本身的问题

阅读全文 »

MySQL中varchar最大长度是多少?

一. varchar存储规则:

  • 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)
  • 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节

二. varchar和char 的区别:

char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是: char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).

阅读全文 »

基于模板使用giter8创建项目

背景

进行分布式服务开发, 各服务均划分了各自的消息协议项目/应用服务项目, 这些项目骨架相同, 仅仅是项目名和包名有个别字的区别; 为此, 笔者经过调研后选择使用giter8来创建项目骨架模板, 后期项目均使用该模板生成项目.

安装giter8

阅读全文 »

使用nexus发布和获取依赖包

背景

开发分布式服务, 各服务会根据命名规范定义各自的消息协议, 某一服务A调用指定服务B时, 服务A需要依赖服务B的消息协议, 使用构建工具(maven/sbt/gradle)+nexus私服可以满足多服务并行开发时, 服务间消息协议构件(artifact)最新版本的发布和获取.

搭建nexus私服

详见参考文章.

仓库

仓库类型

  • group:组仓库,用于方便开发人员自己设定仓库, 该类型可以引用多个已有仓库.
  • hosted: 内部项目的发布仓库
    • maven-releases: 内部发布的正式版本, 即版本不带-SNAPSHOT标识.
    • maven-snapshots: 内部发布的快照版本, 发布上去的构件会自带实践戳, 当有客户端获取时, nexus会取最近生成的进行返回,版本带-SNAPSHOT标识
  • proxy: 从远程仓库中寻找数据的仓库, 例如: 中央库

配置多仓库

创建类型为group的仓库(命名为xxx-central), 同时把需要的远程仓库纳入其中, 目前纳入的仓库有maven-central, maven-releases, maven-snapshots

阅读全文 »

Akka开发手册

背景

  1. 保证多人协作也只写出一种代码, 而非多种代码; 例如: 保证10人只写出一套代码, 避免10人写出100种代码.
  2. 有利于与异构系统进行交互
  3. 有利于工作交接
  4. 系统做大做强的基础

命名规范

交互协议

  • 交互协议根据业务类型封装在object中, 例如: DeviceProtocol
  • 与外围系统交互封装在包protocol/api
  • 内部系统交互封装在包protocol/service
阅读全文 »