必须要吐槽 金蝶的接口文档,简直就是噩梦,文档和示例牛头不对马嘴,示例代码都是错误的
准备工作,金蝶倒是写的很全, 金蝶云星空 OpenApI
这里有一个注意点,就是 kdwebapi.properties
配置
## 账套ID ,在第三方登录授权配置获取
X-KDApi-AcctID=123123123
## APPID ,在第三方登录授权配置获取
X-KDApi-AppID=229492_SYbOQwvH7plexfys4+6MzbUt1q47TNlG12312
## 秘钥 ,在第三方登录授权配置获取
X-KDApi-AppSec=c1cc65ee19dd4be19eb27ec667e123123bf6ed3123123123123
## 调用接口的用户名 ,在第三方登录授权配置获取
X-KDApi-UserName=æŽæ¨123123
## 固定 2052
X-KDApi-LCID=2052
## 这个是你的金蝶云星空产品部署的服务器访问地址
X-KDApi-ServerUrl=http://12.19.119.240/k3cloud/
SDK
解压 后导入 Eclipse 或者 Idea, 结构目录:
mvn install:install-file -Dfile=k3cloud-webapi-sdk.7.6.1.jar -DgroupId=k3cloud -DartifactId=k3cloud-webapi-sdk -Dversion=7.6.1 -Dpackaging=jar
<!-- 金蝶k3 jar, 本地maven 打包 -->
<dependency>
<groupId>k3cloud</groupId>
<artifactId>k3cloud-webapi-sdk</artifactId>
<version>7.6.1</version>
</dependency>
可能会出现的异常
登录会话失效
-> 需要检查配置是否正确
java.net.UnknownHostException: zam.devopen.kingdee.com
-> 修改hosts文件
Windows hosts文件路径:C:\Windows\System32\drivers\etc
hosts文件 加入: 金蝶服务器访问ip或者域名(这个地址 和 kdwebapi服务器路径一样,如果有端口 不需要加端口) zam.devopen.kingdee.com
2.19.109.123 zam.devopen.kingdee.com
比如我现在要调用 生产制造-生产订单-订单列表接口
, 金蝶 单据查询
就是 列表接口
这里有一个很大的坑就是 FieldKeys
显示字段这个坑,这个字段必填,用于指定返回哪些字段,但是 官网的 单据查询接口文档并没有写有哪些字段可以选择
有三种方式可以大概知道有哪些字段
不知道字段 可以去 保存接口
中查看
例如,我现在调用的 是 生产订单列表接口,我不知道选择哪些字段返回,可以去 保存接口
当中找
找到 data.Model.FTreeEntity这个对象参数,里面就是 列表当中存在的字段
** 去 数据字典里面找** 数据字典
推荐 用这种方式 结合 保存接口 基本上 就可以搞定
还可以去 金蝶直接导出 excel, 里面有列名字段
还有一个注意点,就是 接口返回的数据 必须用对象映射
生产订单 - 订单列表测试
配置
import com.kingdee.bos.webapi.sdk.K3CloudApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 金蝶 bean配置
*
*
*
*
* @author Evan <[email protected]>
* @since 2022年06月28日 14:34
*/
@Configuration
public class KingdeeConfig {
@Bean
public K3CloudApi K3CloudApi(){
return new K3CloudApi();
}
}
实体类 PrdMo
import lombok.Data;
/**
* 金蝶生产订单实体类
*
*
*
*
* @author Evan <[email protected]>
* @since 2022年06月28日 14:39
*/
@Data
public class PrdMo {
/**
* 主生产订单ID
*/
private String FID;
/**
* 生产订单号
*/
private String FBillNo;
/**
* 类别说明ID,单据类型ID
*/
private String FBillType;
/**
* 明细订单ID, 一个单据 订单对应多个 订单
*/
private String FTreeEntity_FEntryId;
/**
* 明细行号, 同一个 生产订单号 多个 明细订单,按序号区分
*/
private String FTreeEntity_FEntryId_RowIndex;
/**
* 物料编码ID
*/
private String FMaterialId;
/**
* 物料名称
*/
private String FMaterialName;
/**
* 生产数量
*/
private String FQty;
/**
* 完成数量
*/
private String FRptFinishQty;
/**
* 未完成数量, 生产数量 减去 完成数量
*/
private String FRemainingQty;
/**
* 开工日期
*/
private String FStartDate;
/**
* 完工日期
*/
private String FFinishDate;
/**
* 语言
*/
private String F_SDFG_BasePyuyan;
/**
* 规格型号
*/
private String FSpecification;
/**
* 是否完工
*/
private Boolean isSuccess;
/**
* 创建时间
*/
private String FCreateDate;
}
查询示例
import com.kingdee.bos.webapi.sdk.K3CloudApi;
import com.kingdee.bos.webapi.sdk.QueryParam;
import com.mh.jishi.kingdee.entity.PrdMo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
/**
* 金蝶生产订单服务
*
*
*
*
* @author Evan <[email protected]>
* @since 2022年06月28日 14:36
*/
@Service
@Slf4j
public class KingdeePrdMoService {
private final K3CloudApi api;
public KingdeePrdMoService(K3CloudApi api) {
this.api = api;
}
/**
* 生产订单列表
* @param beginDateTime 开始时间 如果为空,则默认 一天, 尽量不取全部数据
* @param endDateTime 结束时间, 如果为空 根据开始时间 获取默认
*/
public Object QUERY_PRD_MOExecuteDetailRpt(String beginDateTime, String endDateTime) {
// 表单内码ID
String formId = "PRD_MO";
HashMap<String, Object> hashMap = new HashMap<>();
try {
// 需要查询的字段列表
LinkedList<String> fieldKeys = new LinkedList<>();
fieldKeys.add("FID");
fieldKeys.add("FBillNo");
fieldKeys.add("FBillType");
fieldKeys.add("FTreeEntity_FEntryId");
fieldKeys.add("FMaterialId");
fieldKeys.add("FMaterialName");
fieldKeys.add("FQty");
fieldKeys.add("FRptFinishQty");
fieldKeys.add("FStartDate");
fieldKeys.add("FFinishDate");
fieldKeys.add("F_SDFG_BasePyuyan");
fieldKeys.add("FSpecification");
fieldKeys.add("FCreateDate");
// 查询对象
QueryParam queryParam = new QueryParam();
queryParam.setFormId(formId);
queryParam.setFieldKeys(String.join(",", fieldKeys));
// 排序
QueryParam.set
// 筛选条件列表
LinkedList<String> queryfilters = new LinkedList<>();
// 条件筛选
if(StringUtils.isNotBlank(beginDateTime)){
queryfilters.add(String.format("FCreateDate >= '%s'", beginDateTime));
}
if(StringUtils.isNotBlank(endDateTime)){
queryfilters.add(String.format("FCreateDate <= '%s'", endDateTime));
}
if(!CollectionUtils.isEmpty(queryfilters)){
String filterStr = String.join(" and ", queryfilters);
log.info("条件筛选输出: 【{}】", filterStr);
queryParam.setFilterString(filterStr);
}
List<PrdMo> queryList = api.executeBillQuery(queryParam, PrdMo.class);
int total = queryList.size();
hashMap.put("list", queryList);
hashMap.put("total", total);
} catch (Exception e) {
log.error("获取金蝶生产订单异常!");
e.printStackTrace();
}
return hashMap;
}
}
保存示例
示例是 修改生产入库单, 一个入库单据下 有两条明细分录,只修改其中一条分录
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.kingdee.bos.webapi.sdk.K3CloudApi;
import org.junit.Test;
/**
* 金蝶测试2
*
*
*
*
* @author Evan <[email protected]>
* @since 2022年06月24日 15:02
*/
@SuppressWarnings("all")
public class TestKingdee2 {
private K3CloudApi client = new K3CloudApi();
/**
* 保存生产入库订单
* 这个示例 案例是: 单据下 生产入库单据下 有多个订单,只更新某条订单序列号
* FIsNew 是否新增行 要去除, 只更新序列号 需要在 更新字段【NeedUpDateFields】加上FEntity,这样只更新订单内部数据不更新单据信息,IsDeleteEntry 是否删除相同其他分录要设置 false,不然会删除其他的分录
* A单据有{
* aa 订单
* bb 订单
* cc 订单
* }
* 我现在只更新bb订单序列号信息,那么除了 bb 订单序列号有内容 ,其他订单序列号字段不需要填入内容, 请参考 get1方法和get2
*/
@Test
public void TEST_SAVE_PRD_INSTOCK() {
String formId = "PRD_INSTOCK";
// 数据json
JSONObject json = new JSONObject();
// model内容
JSONObject model = new JSONObject();
/*
* 单据数据
*/
// 单据ID
model.put("FID", 104222221);
// 单据编码
model.put("FBillNo", "SCRK2202207022222222222222224001");
// 单据类型
JSONObject FBillTypeJson = new JSONObject();
FBillTypeJson.put("FNUMBER", "SCRKD02_SY2S");
model.put("FBillType", FBillTypeJson);
// 单据创建日期
model.put("FDate", "2022-07-04T00:00:00");
// 货主
JSONObject FOwnerId0Json = new JSONObject();
FOwnerId0Json.put("FNUMBER", 100);
model.put("FOwnerId0", FOwnerId0Json);
// 单据明细订单数据
JSONArray FEntityArray = new JSONArray();
JSONObject FEntityJson = get1();
JSONObject FEntityJson2 = get2();
// 将 单据明细订单 放入进 model
FEntityArray.add(FEntityJson);
// 复制一份
FEntityArray.add(FEntityJson2);
// 复制一份结束
model.put("FEntity", FEntityArray);
//
json.put("Model", model);
// 是否删除已存在的分录,布尔类型,默认true(非必录),这个一定要设置,不然会删除其他数据
json.put("IsDeleteEntry", "false");
// 需要更新的字段,数组类型,格式:[key1,key2,...] (非必录)注(更新单据体字段得加上单据体key)
// JSONArray NeedUpDateFields = new JSONArray();
// NeedUpDateFields.add("FEntity");
// 实收数量
// NeedUpDateFields.add("FRealQty");
// NeedUpDateFields.add("FEntity");
// NeedUpDateFields.add("FEntity_FSerialSubEntity");
// NeedUpDateFields.add("FEntity.FSerialSubEntity.FDetailID");
// NeedUpDateFields.add("FEntity.FSerialSubEntity.FSerialNo");
// NeedUpDateFields.add("FEntity.FSerialSubEntity.FSerialNote");
// json.put("NeedUpDateFields", NeedUpDateFields);
//
// json.put("NeedReturnFields", NeedUpDateFields);
try {
String jsonStr = json.toJSONString();
System.out.printf("json数据: \r%s%n", jsonStr);
String sRet = client.save(formId, jsonStr);
System.out.printf("保存结果: \r%s%n", sRet);
} catch (Exception e) {
e.printStackTrace();
}
}
public JSONObject get1() {
JSONObject FEntityJson = new JSONObject();
// 是否新增行,固定 false
// FEntityJson.put("FIsNew", "false");
// 物料编码
JSONObject FMaterialIdJson = new JSONObject();
FMaterialIdJson.put("FNumber", "03-06-045-220005-00");
FEntityJson.put("FMaterialId", FMaterialIdJson);
// 入库类型
FEntityJson.put("FInStockType", "12");
// 单位
JSONObject FUnitIDJson = new JSONObject();
FUnitIDJson.put("FNumber", "Pcs");
FEntityJson.put("FUnitID", FUnitIDJson);
FEntityJson.put("FEntity_FEntryID", "1215222314");
FEntityJson.put("FEntryID", "1215222314");
FEntityJson.put("ID", "1215222314");
// 应收数量
// FEntityJson.put("FMustQty", "50");
//
// // 实收数量
// FEntityJson.put("FRealQty", "0");
// 成本权重
// FEntityJson.put("FCostRate", "100");
// 单位
JSONObject FBaseUnitIdJson = new JSONObject();
FBaseUnitIdJson.put("FNumber", "Pcs2");
FEntityJson.put("FBaseUnitId", FBaseUnitIdJson);
// 货主类型
FEntityJson.put("FOwnerTypeId", "BD_OwnerOrg");
// 货主
JSONObject FOwnerIdJson = new JSONObject();
FOwnerIdJson.put("FNumber", "101230");
FEntityJson.put("FOwnerId", FOwnerIdJson);
// 仓库
JSONObject FStockIdJson = new JSONObject();
FStockIdJson.put("FNumber", "CK001233");
FEntityJson.put("FStockId", FStockIdJson);
// Bom,如果单据没有就没有
JSONObject FBomIdJson = new JSONObject();
FBomIdJson.put("FNumber", "03-06-045-0005-00_V1.0(中文)");
FEntityJson.put("FBomId", FBomIdJson);
// 生产订单编号
FEntityJson.put("FMoBillNo", "123");
// 生产订单内码
FEntityJson.put("FMoId", "101712351");
// 生产订单分录内码
FEntityJson.put("FMoEntryId", "105123187");
// 生产订单行号
FEntityJson.put("FMoEntrySeq", "22");
// 保管者类型
FEntityJson.put("FKeeperTypeId", "BD_KeeperOrg");
// 库存状态
JSONObject FStockStatusIdJson = new JSONObject();
FStockStatusIdJson.put("FNumber", "KCZT01_SYS");
FEntityJson.put("FStockStatusId", FStockStatusIdJson);
// 保管者
JSONObject FKeeperIdJson = new JSONObject();
FKeeperIdJson.put("FNumber", "100");
FEntityJson.put("FKeeperId", FKeeperIdJson);
// 单据订单明细 序列号列表
JSONArray FSerialSubEntityArray = new JSONArray();
JSONObject FSerialSubEntityJson = new JSONObject();
// 序列号
FSerialSubEntityJson.put("FSerialNo", "李杨1");
// 序列号备注
FSerialSubEntityJson.put("FSerialNote", "李杨1");
FSerialSubEntityArray.add(FSerialSubEntityJson);
// 将 单据明细订单序列号放入订单, 如果这条明细分录订单不需要更新序列号,就不需要这个字段
// FEntityJson.put("FSerialSubEntity", FSerialSubEntityArray);
return FEntityJson;
}
public JSONObject get2() {
JSONObject FEntityJson = new JSONObject();
// 是否新增行,固定 false, 保存才用true
// FEntityJson.put("FIsNew", "false");
// 物料编码
JSONObject FMaterialIdJson = new JSONObject();
FMaterialIdJson.put("FNumber", "03-01-0027-0001-00");
FEntityJson.put("FMaterialId", FMaterialIdJson);
// 入库类型
FEntityJson.put("FInStockType", "12");
// 单位
JSONObject FUnitIDJson = new JSONObject();
FUnitIDJson.put("FNumber", "Pcs");
FEntityJson.put("FUnitID", FUnitIDJson);
FEntityJson.put("FEntity_FEntryID", "1315115316");
FEntityJson.put("FEntryID", "1315115316");
FEntityJson.put("ID", "1315115316");
// 应收数量
// FEntityJson.put("FMustQty", "10");
//
// // 实收数量
// FEntityJson.put("FRealQty", "10");
// 成本权重
// FEntityJson.put("FCostRate", "100");
// 单位
JSONObject FBaseUnitIdJson = new JSONObject();
FBaseUnitIdJson.put("FNumber", "P12cs");
FEntityJson.put("FBaseUnitId", FBaseUnitIdJson);
// 货主类型
FEntityJson.put("FOwnerTypeId", "BD_OwnerOrg");
// 货主
JSONObject FOwnerIdJson = new JSONObject();
FOwnerIdJson.put("FNumber", "101230");
FEntityJson.put("FOwnerId", FOwnerIdJson);
// 仓库
JSONObject FStockIdJson = new JSONObject();
FStockIdJson.put("FNumber", "CK0203");
FEntityJson.put("FStockId", FStockIdJson);
// Bom,如果单据没有就没有
JSONObject FBomIdJson = new JSONObject();
FBomIdJson.put("FNumber", "03-01-007-0001-00_V1.0(日本)");
FEntityJson.put("FBomId", FBomIdJson);
// 生产订单编号
FEntityJson.put("FMoBillNo", "SCDD20220704002");
// 生产订单内码
FEntityJson.put("FMoId", "1017123511");
// 生产订单分录内码
FEntityJson.put("FMoEntryId", "101235189");
// 生产订单行号
FEntityJson.put("FMoEntrySeq", "42");
// 保管者类型
FEntityJson.put("FKeeperTypeId", "BD_KeeperOrg");
// 库存状态
JSONObject FStockStatusIdJson = new JSONObject();
FStockStatusIdJson.put("FNumber", "KCZT01_SYS");
FEntityJson.put("FStockStatusId", FStockStatusIdJson);
// 保管者
JSONObject FKeeperIdJson = new JSONObject();
FKeeperIdJson.put("FNumber", "100");
FEntityJson.put("FKeeperId", FKeeperIdJson);
// 单据订单明细 序列号列表
JSONArray FSerialSubEntityArray = new JSONArray();
JSONObject FSerialSubEntityJson = new JSONObject();
// 第一条序列号
FSerialSubEntityJson.put("FSerialNo", "我是第二个你好呀66666666");
// 序列号备注
FSerialSubEntityJson.put("FSerialNote", "我是第二个你好呀66666666");
JSONObject FSerialSubEntityJson2 = new JSONObject();
// 第二条序列号
FSerialSubEntityJson2.put("FSerialNo", "我是第二个你好呀77777777");
// 序列号备注
FSerialSubEntityJson2.put("FSerialNote", "我是第二个你好呀77777777");
FSerialSubEntityArray.add(FSerialSubEntityJson);
FSerialSubEntityArray.add(FSerialSubEntityJson2);
// 将 单据明细订单序列号放入订单, 如果不需要更新序列号,就不需要这个字段
FEntityJson.put("FSerialSubEntity", FSerialSubEntityArray);
return FEntityJson;
}
/**
* 根据入库单据编号 查看单据信息
*/
@Test
public void TEST_VIEW_PRD_INSTOCK() throws Exception {
String params = "{\"Number\": \"生产入库单据编号\",\"Id\": \"\"}";
String result = client.view("PRD_INSTOCK", params);
JSONObject resultJson = JSONObject.parseObject(result);
if (result.indexOf(",\"IsSuccess\":false,") != -1) {
System.out.printf("查询异常 原因:\r%s%n",
resultJson.getJSONObject("Result").getJSONObject("ResponseStatus").getJSONArray("Errors"));
} else {
System.out.printf("查询成功:\r%s%n\n", result);
}
}
}
Jar程序 目录,要把配置放在jar同一级
War Tomcat 这个需要去研究,要把配置放在和程序同一级才有效
如果最后打包出来Jar 在windows上面运行,你会发现 请求金蝶一直异常,会提示会话失效问题
这个问题困扰我了整整一个月,没有任何文档,相关论坛也没有出现过这个问题,连金蝶技术人员也不知道什么问题
52936 简体中文(HZ)
936 中国 - 简体中文(GB2312)
950 繁体中文(Big5)
65001 Unicode (UTF-8)
1200 Unicode
要把编码改为 65001 Unicode (UTF-8)
才可以正常请求金蝶
但是很遗憾,windows不支持修改编码,所以只能在linux上面运行, 修改windows编码为UTF-8也运行不了
但是 但是 但是 ,改windows编码不行,可以改JVM编码,Java程序都是在JVM上面跑
只需要改一下JVM就可以解决了
如果是 Jar程序 修改为
java -Dfile.encoding=utf-8 -jar test.jar
如果是Tomcat ,找到 Tomcat中配置catalina文件
Linux中,在catalina.sh配置JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=utf-8"
Windows中,在catalina.bat配置set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8
找到 cfgUtil.class 这个文件 ,打一个断点,测试是否加载配置正确
把linux改为 和windows一样的编码再去运行程序,记得备份 Linux原配置
Linux查看编码命令
locale
Linux修改 编码命令(centos 7)
vim /etc/locale.conf
修改为 windows编码
LANG=zh_CN.gb2312
再去运行程序,就会发现 请求金蝶api就会出现 会话失效,哪怕是配置明明读取是正常的,可就是请求不了
程序打包出来是一个jar包,要把金蝶配置文件放在 和jar 同级目录,直接系统创建一份配置文件
使用 FileUtils org.apache.commons.io.FileUtils
需要加入 commons.io maven
依赖或者 jar包
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
## jar 运行 要设置 编码格式 不然请求金蝶会异常 java -Dfile.encoding=utf-8 -jar 要运行的jar包.jar
## 这个配置文件 要放在和 程序jar包 同一级目录
X-KDApi-AcctID=AcctID
X-KDApi-AppID=AppID
X-KDApi-AppSec=AppSec
X-KDApi-UserName=金蝶账号用户名
X-KDApi-LCID=2052
X-KDApi-ServerUrl=金蝶服务url
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.io.FileUtils;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
/**
* 系统启动,创建一些必要相关配置文件
*
*
*
*
* @author 作者<[email protected]>
* @since 2022年09月07日 下午2:38:50
**/
@Configuration
@Slf4j
public class InitDefaultConfigTask {
static {
try {
/**
* 一定保证 创建金蝶配置文件 要比 金蝶SDK读取配置先执行
*/
createKingDeeConfigFIle();
} catch (IOException e) {
}
}
/**
* 创建金蝶配置文件
* 因为金蝶SDK读取配置文件是根据 jar所在路径读取配置,所以创建的配置文件要与jar程序在同一级目录
* 可以事先将 源配置文件放在 resources下,可以让程序读取到源文件 ,然后在jar 目录在创建一份
* @throws IOException
*/
private static void createKingDeeConfigFIle() throws IOException {
log.info("================== 系统启动 开始创建金蝶配置文件 ================== ");
/**
* 输出文件的路径
*
* @filed outFilePath 当前 程序jar路径, 比如当前 程序jar 在D:\my\jar, 那么路径就是 D:\my\jar +
* 在拼接上文件名称
*/
String outFilePath = (new File(".")).getCanonicalPath();
// 判断 金蝶配置文件是否存在
outFilePath = outFilePath.concat("/kdwebapi.properties");
File file = new File(outFilePath);
if(!file.exists()) {
log.info("================== 金蝶配置文件不存在,创建一份 ================== ");
// 读取 resources下源文件
String sourcePath = "/kdwebapi.properties";
// 获取输入流
Resource resource = new ClassPathResource(sourcePath);
InputStream inputStream = resource.getInputStream();
// 将inputStream 流复制源文件 到 jar 目录
FileUtils.copyInputStreamToFile(inputStream, file);
inputStream.close();
}else {
log.info("================== 金蝶配置文件存在 不需要创建 ================== ");
}
log.info("================== 系统启动 创建金蝶配置文件完成 ================== ");
}
}
启动jar 要设置 编码
-Dfile.encoding=utf-8
完整运行命令:
java -Dfile.encoding=utf-8 -Duser.timezone=Asia/Shanghai -Xms1024m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC -jar 程序jar名称.jar
JVM启动参数:
命令 | 介绍 |
---|---|
-Dfile.encoding=utf-8 | 设置系统文件编码格式为utf-8,针对金蝶SDK配置文件使用 |
-Duser.timezone=Asia/Shanghai | 时区 |
-Xms1024m | JVM初始内存 |
-Xmx1024m | JVM最大可用内存 |
-XX:MetaspaceSize=128m | 元空间 初始内存大小(永久代) |
-XX:MaxMetaspaceSize=128m | 元空间最大大小(永久代) |
-XX:+HeapDumpOnOutOfMemoryError | 开启堆快照 |
-XX:+PrintGCDateStamps | 打印GC日志的日期格式 |
-XX:+PrintGCDetails | 打印详细的GC日志 |
-XX:NewRatio=1 | 老年代占1/2 |
-XX:SurvivorRatio=30 | |
-XX:+UseParallelGC | 指定使用 并行垃圾收集器 |
-XX:+UseParallelOldGC | 指定使用 增强版并行垃圾收集器 |
-jar 程序名称.jar | 运行的jar程序 |
启动完成