Java Jar包运行参数

Java程序编译为Jar包后,使用nohup java [-options] -jar jarfile > LOG_FILE 2>&1 &来后台运行。 本文主要是options参数的配置简单讲解。 假设我们的应用依赖的JDK版本是1.8 假设我们的虚拟机的内存是4196MB(可通过free -m | awk '/Mem/{print $2}'来查看) -server 选择VM -server -Xms -Xmx -Xmn -Xss 设置初始 Java 堆大小,推荐设置为内存的一半大小,这里是2048m 设置最大 Java 堆大小,推荐设置为内存的一半大小,这里是2048m 设置年轻代大小,推荐设置为Xms的3/8,这里是768m 设置 Java 线程堆栈大小,建议256k 详解可以参考这篇文章 -Xms2048m -Xmx2048m -Xmn768m -Xss256k -XX:MetaspaceSize= -XX:MaxMetaspaceSize= XX:MetaspaceSize=推荐设置为Xms的1/4 XX:MaxMetaspaceSize=推荐设置为Xms的1/2 这对参数的详解,可以参考下这篇文章 -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:SurvivorRatio Eden区与Survivor区的大小比值,推荐8 其他,未完待续………

阅读全文

设计模式学习 - 策略模式

学习、梳理设计模式。 策略模式 由策略接口、多个具体的策略实现、上下文组成。由客户端来选择具体的策略实现。 一个背景,CRM系统内有多种帐号体系:手机号注册的客户、微信授权的客户、微博授权的客户。 一个场景,需要把这些不同帐号体系的ID转换为CRM系统内部的统一UserId。 策略接口及实现 策略接口 public interface UserStrategy { long transform2UserId(String origin); } 手机号客户实现 public class MobileUserStrategy implements UserStrategy { @Override public long transform2UserId(String origin) { return 1L; } } 微信客户实现 public class OpenIdUserStrategy implements UserStrategy { @Override public long transform2UserId(String origin) { return 3L; } } 微博客户实现 public class WeiBoIdUserStrategy implements UserStrategy { @Override public long transform2UserId(String origin) { return 2L; } } 上下文 public class UserContext { private UserStrategy userStrategy; public UserContext(UserStrategy userStrategy) { this.……

阅读全文

设计模式学习 - 工厂模式

学习、梳理设计模式。 工厂模式 工厂方法模式 根据不同的对象,提供不同的工厂,然后由客户端来选择对应的工厂。这也是与简单工厂模式的不同的地方。 人 接口 public interface People { void speek(); } 男孩 public class Boy implements People { @Override public void speek() { System.out.println("boy"); } } 女孩 public class Girl implements People { @Override public void speek() { System.out.println("girl"); } } 人 工厂 public interface PeopleFactory { People getPeople(); } 男孩 工厂 public class BoyFactory implements PeopleFactory { @Override public People getPeople() { return new Boy(); } } 女孩 工厂……

阅读全文

设计模式学习 - 适配器模式

学习、梳理设计模式。 适配器模式 不兼容的转换为兼容的,为解决兼容问题而生。 实现方式可分为组合方式和继承方式。 举个例子,充电宝只能用二相电供电,但现在只有三相电该怎么办呢? 三相电实例 /** * 三相电 */ public class ThreePlug { public void powerWithThree() { System.out.println("使用三相供电"); } } 二相电接口 /** * 二相接口 */ public interface TwoPlugInterface { /** * 二相电流供电 */ void powerWithTwo(); } 充电宝 /** * 充电宝 */ public class PowerBank { /** * 需要二相供电 */ private TwoPlugInterface twoPlugInterface; public PowerBank(TwoPlugInterface twoPlugInterface) { this.twoPlugInterface = twoPlugInterface; } public void power() { twoPlugInterface.powerWithTwo(); } } 组合方式 我们来定义个三相适配器(接收三相电,对外提供二相电)。……

阅读全文

设计模式学习 - 模版方法模式

学习、梳理设计模式。 模版方法模式 模版方法模式,以继承的方式来实现,提升代码的复用性,适合具有相同或相似的步骤的逻辑处理。 由抽象基类和具体子类来具体实现。 抽象基类 具体的逻辑抽象为几个步骤,具有相同步骤的可以抽象为基本方法,不同的可以抽象为抽象方法,对于有个性化需求的(比如不是所有步骤都需要的)可以用钩子来进行控制,最后是组合这些步骤的模版方法。 基本方法 抽象方法 可选钩子(Hook) 模版方法(final) /** * 宠物基类 */ public abstract class AbstracthPet { /** * 喂食 */ public final void feedingTemplate() { //1. buyFood(); //2. cook(); //3. pourInDish(); if (isAddMilk()) { //4. addMilk(); } } protected boolean isAddMilk() { return true; } private void buyFood() { System.out.println("1. 买粮"); } protected abstract void cook(); private void pourInDish() { System.out.println("3. 倒入盘子"); } private void addMilk() { System.……

阅读全文

设计模式学习 - 单例模式

学习、梳理设计模式。 单例模式 单例模式分为饿汉模式和懒汉模式。 饿汉模式 私有化构造函数 创建私有实例 提供公开的获取实例的方法 public class Person { private static Person instance = new Person(); private Person() { } public static Person getInstance() { return instance; } } 懒汉模式 私有化构造函数 声明私有实例 提供公开的获取实例的方法(获取时为空则进行创建) public class Person { private static Person instace; private Person() { } public static Person getInstance() { if (instace == null) { return new Person(); } return instace; } } 总结 两种模式都需要先私有化构造函数以禁止直接new操作来创建实例,不然就失去了单例的意义。……

阅读全文

有赞云GoLang版SDK 非官方

前段时间看了些GoLang的资料,要上手熟悉就得造轮子,so.. 造了个GoLang版本的有赞云SDK。 Talk is cheap. Show me the code… GitHub: https://github.com/xu42/youzan-sdk-go GoDoc: https://godoc.org/github.com/xu42/youzan-sdk-go GoLang写出来确实简洁,总共也没多少行代码… 使用 这里仅举例获取Token和调用示例API 生成Token package main import ( "fmt" "github.com/xu42/youzan-sdk-go" ) func main() { // 获取自用型AccessToken resp, err := youzan.GenSelfToken("CLIENT_ID", "CLIENT_SECRET", "110") fmt.Println(resp, resp.AccessToken, err) // 获取自用型AccessToken resp1, err1 := youzan.GenToolToken("CLIENT_ID", "CLIENT_SECRET", "CODE", "URI") fmt.Println(resp1, resp1.AccessToken, err1) } 调用API package main import ( "fmt" "github.com/xu42/youzan-sdk-go" ) func main() { params := map[string]string{ "page_no": "1", "page_size": "10", } result, err := youzan.……

阅读全文

Go couldn't start listener listen tcp lookup localhost no such host

使用GoLang进行debug时, 报了这么个错couldn't start listener: listen tcp: lookup localhost: no such host 其实很简单,是因为本地的hosts文件少配置了127.0.0.1 localhost 为什么少了这行配置?可能是其他开发时切换了hosts配置而刚好那个配置没有加这一行 添加这一行后如果没有生效,记得清一下缓存 (hugo的文章标题竟然不能带标点符号:…) End………

阅读全文

Go vet composite literal uses unkeyed fields

在使用go vet进行语法检查时, 报了这么个错composite literal uses unkeyed fields 对于刚开始看Golang的我一脸懵逼, 明明是可以编译通过且跑通的… struct 是这样定义的 type CallRequest struct { AccessToken string APIName string APIVersion string APIParams map[string]string } 代码里是这样用的 // ... 省略 ... request := CallRequest{accessToken, apiName, apiVersion, params} 然后 go vet ./... 就报错了... composite literal uses unkeyed fields 看了些资料后知道了, 这样写更严谨一些: request := CallRequest{AccessToken: accessToken, APIName: apiName, APIVersion: apiVersion, APIParams: params} End………

阅读全文

Travis 持续集成 GoLang 工程, 配置 踩坑记录

最近看了一些GoLang方面的文章,平时用来写一些脚本还是比较不错的。尤其是其可编译为二进制单一文件跨平台运行的特性,实在是让人喜爱。就我个人来说,解决了给没有计算机编程基础的人的环境下跑脚本要安装一堆环境/依赖的痛点。travis作为优秀的持续集成服务,其诸多的特性也值得尝试一下,与GitHub进行完美的结合,支持打包部署到项目release,当然travis的特性并不只有这些。 Travis-ci 首先,需要注册一下 Travis-ci ,直接使用GitHub授权登陆即可。 授权之后会要求进行同步GitHub项目,对需要使用Travis服务的勾选即可,Travis会自动给勾选的项目添加一个钩子,每当push代码就会触发Travis测试任务。当然,也可以手动到Travis进行手动触发(Trigger build),且可直接指定某一个commit触发。 ⚠️踩坑记录 Travis-ci.org是只支持public repo的,如果有private的需求的,可以到Travis-ci.com 如果有repo没有显示出来,可以在Travis的profile页面执行Sync account 如果是所属的组织没有显示出来,可以点击Review and add 进行授权同步。 .travis.yml .travis.yml文件是Travis服务读取项目配置的文件,支持多种语言,这里是GoLang的参考配置,支持上面介绍的打包部署。配置项这里不细讲,网上有很多介绍的文章。 可以在Job log控制台看到执行情况。 ⚠️踩坑记录 Travis打包部署到GitHub需要授权,可以通过Token的形式进行授权,这需要在.travis.yml配置文件的deploy块的 api_key 进行说明,然后需要在 Github Token 页生成一个包含repo权限的Token,然后在Travis项目的设置页面Environment Variables新增一条配置: Name为你在api_key处声明的变量,Value为生成的Token. 参考 https://docs.travis-ci.com/user/deployment/releases/ https://github.com/GameXG/TcpRoute2/blob/master/.travis.yml ……

阅读全文