|
6 | 6 | ## 作业内容 |
7 | 7 |
|
8 | 8 |
|
9 | | -> Week01 作业题目(周四): |
| 9 | +> Week01 作业题目: |
10 | 10 |
|
11 | | -1.(选做)自己写一个简单的 Hello.java,里面需要涉及基本类型,四则运行,if 和 for,然后自己分析一下对应的字节码,有问题群里讨论。 |
| 11 | +1.(必做)自己写一个简单的 HelloNum.java,里面需要涉及基本类型,四则运行,if 和 for,然后自己分析一下对应的字节码,有问题群里讨论。 |
12 | 12 |
|
13 | 13 | 2.(必做)自定义一个 Classloader,加载一个 Hello.xlass 文件,执行 hello 方法,此文件内容是一个 Hello.class 文件所有字节(x=255-x)处理后的文件。文件群里提供。 |
14 | 14 |
|
|
18 | 18 |
|
19 | 19 | 注意:如果没有线上系统,可以自己 run 一个 web/java 项目。 |
20 | 20 |
|
21 | | -> Week01 作业题目(周六): |
| 21 | +5.(选做)本机使用 G1 GC 启动一个程序,仿照课上案例分析一下 JVM 情况。 |
22 | 22 |
|
23 | | -1.(选做)本机使用 G1 GC 启动一个程序,仿照课上案例分析一下 JVM 情况。 |
24 | 23 |
|
25 | 24 |
|
26 | 25 | ## 操作步骤 |
27 | 26 |
|
28 | 27 |
|
29 | | -### 作业2 |
| 28 | +### 作业1(必做) |
| 29 | + |
| 30 | +1. 编写代码, 根据自己的意愿随意编写, 可参考: [HelloNum.java](./HelloNum.java) |
| 31 | +2. 编译代码, 执行命令: `javac -g HelloNum.java` |
| 32 | +3. 查看反编译的代码。 |
| 33 | + - 3.1 可以安装并使用idea的jclasslib插件, 选中 [HelloNum.java](./HelloNum.java) 文件, 选择 `View --> Show Bytecode With jclasslib` 即可。 |
| 34 | + - 3.2 或者直接通过命令行工具 javap, 执行命令: `javap -v HelloNum.class` |
| 35 | +4. 分析相关的字节码。【此步骤需要各位同学自己进行分析】 |
| 36 | + |
| 37 | + |
| 38 | +### 作业2(必做) |
30 | 39 |
|
31 | 40 | 1. 打开 Spring 官网: https://spring.io/ |
32 | 41 | 2. 找到 Projects --> Spring Initializr: https://start.spring.io/ |
33 | 42 | 3. 填写项目信息, 生成 maven 项目; 下载并解压。 |
34 | 43 | 4. Idea或者Eclipse从已有的Source导入Maven项目。 |
35 | | -5. 增加课程资源 Hello.xlass 文件到 src/main/resources 目录。 |
36 | | -6. 编写代码,实现 findClass 方法,解码方法 |
| 44 | +5. 从课件资料中找到资源 Hello.xlass 文件并复制到 src/main/resources 目录。 |
| 45 | +6. 编写代码,实现 findClass 方法,以及对应的解码方法 |
37 | 46 | 7. 编写main方法,调用 loadClass 方法; |
38 | 47 | 8. 创建实例,以及调用方法 |
39 | 48 | 9. 执行. |
40 | 49 |
|
41 | | -具体的参见: [https://github.com/renfufei/JAVA-000/blob/main/Week_01/homework01/src/main/java/com/renfufei/homework01/XlassLoader.java](XlassLoader.java) |
| 50 | +具体代码可参考: [XlassLoader.java](./XlassLoader.java) |
| 51 | + |
| 52 | + |
| 53 | +### 作业3(必做) |
| 54 | + |
| 55 | +对应的图片需要各位同学自己绘制,可以部分参考PPT课件。 |
| 56 | + |
| 57 | +提示: |
| 58 | + |
| 59 | +- Xms 设置堆内存的初始值 |
| 60 | +- Xmx 设置堆内存的最大值 |
| 61 | +- Xmn 设置堆内存中的年轻代的最大值 |
| 62 | +- Meta 区不属于堆内存, 归属为非堆 |
| 63 | +- DirectMemory 直接内存, 属于 JVM 内存中开辟出来的本地内存空间。 |
| 64 | +- Xss设置的是单个线程栈的最大空间; |
| 65 | + |
| 66 | +JVM进程空间中的内存一般来说包括以下这些部分: |
| 67 | + |
| 68 | +- 堆内存(Xms ~ Xmx) = 年轻代(~Xmn) + 老年代 |
| 69 | +- 非堆 = Meta + CodeCache + ... |
| 70 | +- Native内存 = 直接内存 + Native + ... |
| 71 | +- 栈内存 = n * Xss |
| 72 | + |
| 73 | +另外,注意区分规范与实现的区别, 需要根据具体实现以及版本, 才能确定。 一般来说,我们的目的是为了排查故障和诊断问题,大致弄清楚这些参数和空间的关系即可。 具体设置时还需要留一些冗余量。 |
| 74 | + |
| 75 | + |
| 76 | +### 4.(选做) |
| 77 | + |
| 78 | +这个是具体案例分析, 请各位同学自己分析。 |
| 79 | + |
| 80 | +比如我们一个生产系统应用的启动参数为: |
| 81 | + |
| 82 | +``` |
| 83 | +JAVA_OPTS=-Xmx200g -Xms200g -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -XX:ZCollectionInterval=30 -XX:ZAllocationSpikeTolerance=5 -XX:ReservedCodeCacheSize=2g -XX:InitialCodeCacheSize=2g -XX:ConcGCThreads=8 -XX:ParallelGCThreads=16 |
| 84 | +``` |
| 85 | + |
| 86 | +另一个系统的启动参数为: |
| 87 | + |
| 88 | +``` |
| 89 | +JAVA_OPTS=-Xmx4g -Xms4g -XX:+UseG1GC -XX:MaxGCPauseMillis=50 |
| 90 | +``` |
| 91 | + |
| 92 | +具体如何设置, 需要考虑的因素包括: |
| 93 | + |
| 94 | +- 系统容量: 业务规模, 并发, 成本预算; 需要兼顾性能与成本; |
| 95 | +- 延迟要求: 最坏情况下能接受多少时间的延迟尖刺。 |
| 96 | +- 吞吐量: 根据业务特征来确定, 比如, 网关, 大数据底层平台, 批处理作业系统, 在线实时应用, 他们最重要的需求不一样。 |
| 97 | +- 系统架构: 比如拆分为小内存更多节点, 还是大内存少量节点。 |
| 98 | +- 其他... |
| 99 | + |
| 100 | + |
| 101 | +### 5.(选做) |
| 102 | + |
| 103 | +例如使用以下命令: |
| 104 | + |
| 105 | +``` |
| 106 | +# 编译 |
| 107 | +javac -g GCLogAnalysis.java |
| 108 | +# JDK8 启动程序 |
| 109 | +java -Xmx2g -Xms2g -XX:+UseG1GC -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:gc.log GCLogAnalysis |
| 110 | +``` |
| 111 | + |
| 112 | +尝试使用课程中介绍的各种工具JDK命令行和图形工具来进行分析。 |
| 113 | + |
| 114 | +其中 [GCLogAnalysis.java](./GCLogAnalysis.java) 文件也可以从课件资料zip中找到. |
| 115 | + |
| 116 | +## 几个命令用法 |
| 117 | +### 1、十六进制方式查看文件 |
| 118 | +`hexdump -C Hello.class` |
| 119 | +输出:`00000000 ca fe ba be 00 00 00 34 00 1c 0a 00 06 00 0e 09` |
| 120 | + |
| 121 | +可以看到magic number: `cafe babe`, |
| 122 | +以及`00 00 00 34`,十六进制34=十进制3*16+4=52,这是jdk8,如果是jdk11则是55,十六进制37. |
| 123 | + |
| 124 | +### 2、Base64方式编码文件 |
| 125 | +`base64 Hello.class` |
| 126 | +### 3、显示JVM默认参数 |
| 127 | +``` |
| 128 | +java -XX:+PrintFlagsFinal -version |
| 129 | +
|
| 130 | +java -XX:+PrintFlagsFinal -version | grep -F " Use" | grep -F "GC " |
| 131 | +
|
| 132 | +java -XX:+PrintFlagsFinal -version | grep MaxNewSize |
| 133 | +
|
| 134 | +``` |
| 135 | + |
| 136 | +### 4、切换不同jdk |
| 137 | +``` |
| 138 | +jenv shell 1.8 |
| 139 | +jenv shell 11 |
| 140 | +``` |
| 141 | +显示所有jdk |
| 142 | +``` |
| 143 | +jenv versions |
| 144 | +``` |
| 145 | + |
| 146 | +## 更多资料 |
| 147 | + |
| 148 | +更多中英文的技术文章和参考资料: <https://github.com/cncounter/translation> |
| 149 | + |
0 commit comments