背景

java启动命令是所有Java应用程序的入口,通过它来启动Java运行时环境,并加载相关的class。不过由于IDE的盛行,我们Java程序员中的大多数并不是非常的了解Java启动命令。本文希望做一个Java启动命令的汇总,和各位同道分享,也便于日后作为自己的参考。

Java启动命令语法

Java启动命令有两个,java以及javaw,它们的唯一区别是javaw不会启动一个控制台窗口(启动失败的时候会弹出附有错误信息的窗口),而java会。不希望有控制台的时候用javaw,其它时候用java。它们的语法结构都一样,只需要记住其中一个即可。调用程序有两种方式,指定Class以及指定jar文件,具体的语法如下:

JVM堆内存原理及参数设置堆内存定义(白话版)

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

原理

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

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 等等,不同的应用场景也会需要使用到不同的签名加密算法,或者需要搭配不一样的 签名加密算法 来达到业务目标。这里简单的给大家介绍几种常见的签名加密算法和一些典型场景下的应用。

正文数字签名

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

java程序所使用到的命令(Java启动命令和可选项)(1)

秒懂mycat背景

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

mycat架构

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

mycat1.6版本架构如下:

java程序所使用到的命令(Java启动命令和可选项)(2)

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

阅读全文 »

Java应用线上排查总结背景

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

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

java程序所使用到的命令(Java启动命令和可选项)(3)

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

CPU 利用率高/飙升

场景预设:

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

预先说明:

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

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

使用jstack和jmap分析线上故障背景

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

java程序所使用到的命令(Java启动命令和可选项)(4)

操作步骤1、排查思路

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

  • 系统本身代码问题
  • 内部下游系统的问题导致的雪崩效应
  • 上游系统调用量突增
  • http请求第三方的问题
  • 机器本身的问题

阅读全文 »

MySQL中varchar最大长度是多少?

发表于 2018-12-03 | 分类于 MySQL | 0

一. 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私服

详见参考文章.

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

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

下载构件maven

在pom.xml文件的project节点下加入如下内容,

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

<!-- nexus仓库 --> <repositories> <repository> <id>xxx-central</id> <name>xxx-central</name> <!-- xxx-central为创建的类型为group的组仓库 --> <url>http://192.168.10.180:8081/repository/xxx-central/</url> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> </repositories>

sbt

在build.sbt文件末尾增加如下内容,

1 2

// xxx-central为创建的类型为group的组仓库 resolvers = "xxx-central" at "http://192.168.10.180:8081/repository/xxx-central/"

发布构件
  • 正式版: x.x.x, 例如: 1.1.0, 该版本构件将发布至maven-releases仓库中
  • 快照版:x.x.x-SNAPSHOT, 例如: 1.1.0-SNAPSHOT, 该版本构件将发布至maven-snapshots仓库中
maven

发布构件需要进行认证, 在maven的setting.xml文件中servers节点下增加如下配置

1 2 3 4 5 6 7 8 9 10 11

<server> <id>snapshots</id> <username>admin</username> <password>admin123</password> </server> <server> <id>release</id> <username>admin</username> <password>admin123</password> </server>

在pom.xml文件的project节点下加入如下内容,

1 2 3 4 5 6 7 8 9 10 11 12 13

<!-- 发布jar到nexus --> <distributionManagement> <repository> <id>release</id> <name>Nexus Release</name> <url>http://192.168.10.180:8081/repository/maven-releases/</url> </repository> <snapshotRepository> <id>snapshots</id> <name>Nexus Snapshot</name> <url>http://192.168.10.180:8081/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement>

发布指令

maven clean deploy

sbt

在build.sbt中增加如下配置,

1 2 3 4 5 6 7 8

publishTo := { val nexus = "http://192.168.10.180:8081/" if (isSnapshot.value) { Some("maven-snapshot" at nexus "repository/maven-snapshots/") } else { Some("maven-releases" at nexus "repository/maven-releases/") } }

显式配置credential

在build.sbt中增加如下配置,

1 2 3 4 5 6

credentials = Credentials( "Sonatype Nexus Repository Manager", "192.168.10.180:8081", "admin", "admin123" )

隐式配置credential

新建sonatype.sbt文件, 并将其放置于sbt目录下, 内容如下

1 2 3 4 5 6

credentials = Credentials( "Sonatype Nexus Repository Manager", "192.168.10.180:8081", "admin", "admin123" )

发布指令
  • 发布本地: sbt publish
  • 发布至远程: sbt publishSigned

详见: 发布Scala构件至Maven中央库

注意事项

以上配置针对nexus 3.x.x, 2.x.x和3.x.x差异如下,

  • 配置界面不太一样, 但核心功能一致
  • 获取和发布的url path不一样
,