Skip to content

Commit da7adaf

Browse files
authored
Merge pull request #1 from JavaCourse00/main
pull
2 parents 68af61f + 4837b4e commit da7adaf

21 files changed

Lines changed: 449 additions & 53 deletions

File tree

01jvm/Hello.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
public class Hello {
2+
public static void main(String[] args) {
3+
int num1 = 1; // 字面量1;
4+
double num2 = 2.0D; // 大小写的D都可以
5+
long num3 = 3L; // 大小写的L都可以, 加L是好习惯;
6+
byte num4 = 4; // 可以直接赋予 [-128, 127] 范围内的字面量;
7+
if ("".length() < 10) {
8+
// 错误用法: num2 + num3 = 2.03
9+
System.out.println("错误用法: num2 + num3 = " + num2 + num3);
10+
}
11+
for (int i = 0; i < num1; i++) {
12+
// 四则运算: num1 * num4 = 4
13+
System.out.print("四则运算: num1 * num4 = ");
14+
System.out.println(num1 * num4);
15+
}
16+
}
17+
}

01jvm/README.md

Lines changed: 85 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
## 作业内容
77

88

9-
> Week01 作业题目(周四)
9+
> Week01 作业题目:
1010
1111
1.(选做)自己写一个简单的 Hello.java,里面需要涉及基本类型,四则运行,if 和 for,然后自己分析一下对应的字节码,有问题群里讨论。
1212

@@ -18,24 +18,102 @@
1818

1919
注意:如果没有线上系统,可以自己 run 一个 web/java 项目。
2020

21-
> Week01 作业题目(周六):
21+
5.(选做)本机使用 G1 GC 启动一个程序,仿照课上案例分析一下 JVM 情况。
2222

23-
1.(选做)本机使用 G1 GC 启动一个程序,仿照课上案例分析一下 JVM 情况。
2423

2524

2625
## 操作步骤
2726

2827

29-
### 作业2
28+
### 作业1(选做)
29+
30+
1. 编写代码, 根据自己的意愿随意编写, 可参考: [Hello.java](./Hello.java)
31+
2. 编译代码, 执行命令: `javac -g Hello.java`
32+
3. 查看反编译的代码。
33+
- 3.1 可以安装并使用idea的jclasslib插件, 选中 [Hello.java](./Hello.java) 文件, 选择 `View --> Show Bytecode With jclasslib` 即可。
34+
- 3.2 或者直接通过命令行工具 javap, 执行命令: `javap -v Hello.class`
35+
4. 分析相关的字节码。【此步骤需要各位同学自己进行分析】
36+
37+
38+
### 作业2(必做)
3039

3140
1. 打开 Spring 官网: https://spring.io/
3241
2. 找到 Projects --> Spring Initializr: https://start.spring.io/
3342
3. 填写项目信息, 生成 maven 项目; 下载并解压。
3443
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 方法,以及对应的解码方法
3746
7. 编写main方法,调用 loadClass 方法;
3847
8. 创建实例,以及调用方法
3948
9. 执行.
4049

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+
118+
更多中英文的技术文章和参考资料: <https://github.com/cncounter/translation>
119+

01jvm/XlassLoader.java

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import java.io.Closeable;
2+
import java.io.IOException;
3+
import java.io.InputStream;
4+
import java.lang.reflect.Method;
5+
6+
/*
7+
第一周作业:
8+
2.(必做)自定义一个 Classloader,加载一个 Hello.xlass 文件,执行 hello 方法,此文件内容是一个 Hello.class 文件所有字节(x=255-x)处理后的文件。文件群里提供。
9+
*/
10+
public class XlassLoader extends ClassLoader {
11+
12+
public static void main(String[] args) throws Exception {
13+
// 相关参数
14+
final String className = "Hello";
15+
final String methodName = "hello";
16+
// 创建类加载器
17+
ClassLoader classLoader = new XlassLoader();
18+
// 加载相应的类
19+
Class<?> clazz = classLoader.loadClass(className);
20+
// 看看里面有些什么方法
21+
for (Method m : clazz.getDeclaredMethods()) {
22+
System.out.println(clazz.getSimpleName() + "." + m.getName());
23+
}
24+
// 创建对象
25+
Object instance = clazz.getDeclaredConstructor().newInstance();
26+
// 调用实例方法
27+
Method method = clazz.getMethod(methodName);
28+
method.invoke(instance);
29+
}
30+
31+
@Override
32+
protected Class<?> findClass(String name) throws ClassNotFoundException {
33+
// 如果支持包名, 则需要进行路径转换
34+
String resourcePath = name.replace(".", "/");
35+
// 文件后缀
36+
final String suffix = ".xlass";
37+
// 获取输入流
38+
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(resourcePath + suffix);
39+
try {
40+
// 读取数据
41+
int length = inputStream.available();
42+
byte[] byteArray = new byte[length];
43+
inputStream.read(byteArray);
44+
// 转换
45+
byte[] classBytes = decode(byteArray);
46+
// 通知底层定义这个类
47+
return defineClass(name, classBytes, 0, classBytes.length);
48+
} catch (IOException e) {
49+
throw new ClassNotFoundException(name, e);
50+
} finally {
51+
close(inputStream);
52+
}
53+
}
54+
55+
// 解码
56+
private static byte[] decode(byte[] byteArray) {
57+
byte[] targetArray = new byte[byteArray.length];
58+
for (int i = 0; i < byteArray.length; i++) {
59+
targetArray[i] = (byte) (255 - byteArray[i]);
60+
}
61+
return targetArray;
62+
}
63+
64+
// 关闭
65+
private static void close(Closeable res) {
66+
if (null != res) {
67+
try {
68+
res.close();
69+
} catch (IOException e) {
70+
e.printStackTrace();
71+
}
72+
}
73+
}
74+
}

03concurrency/0301/src/main/java/java0/conc0303/Homework03.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class Homework03 {
1414
public static void main(String[] args) {
1515

1616
long start=System.currentTimeMillis();
17+
1718
// 在这里创建一个线程或线程池,
1819
// 异步执行 下面方法
1920

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
package io.kimmking.java8;
22

3-
import lombok.Data;
3+
import lombok.*;
4+
import lombok.extern.slf4j.Slf4j;
45

5-
@Data
6+
@ToString
7+
@NoArgsConstructor
8+
@AllArgsConstructor
9+
@Slf4j
10+
@Builder
11+
@Getter
12+
@Setter
613
public class A {
7-
14+
815
private int age;
9-
16+
17+
private String name;
18+
1019
}

04fx/java8/src/main/java/io/kimmking/java8/GenericDemo.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package io.kimmking.java8;
22

3+
import java.io.Serializable;
34
import java.lang.reflect.ParameterizedType;
45
import java.lang.reflect.Type;
56

6-
public class GenericDemo {
7+
public class GenericDemo implements Serializable {
78
public static void main(String[] args) {
89
Demo demo = new Demo();
910
Class clazz = demo.getClass();
@@ -20,7 +21,7 @@ public static void main(String[] args) {
2021
System.out.println(c);
2122
}
2223

23-
public static class Person<T> {
24+
public static class Person<T extends Serializable> {
2425

2526
}
2627

04fx/java8/src/main/java/io/kimmking/java8/GuavaDemo.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ private static void testEventBus() {
4848
// Callback/Listener
4949
//
5050
Student student2 = new Student(2, "KK02");
51-
System.out.println("I want " + student2 + " run now.");
51+
System.out.println(Thread.currentThread().getName()+" I want " + student2 + " run now.");
5252
bus.post(new AEvent(student2));
5353
}
5454

@@ -81,6 +81,7 @@ private static List<Integer> testList() {
8181
List<Integer> list = Lists.newArrayList(4,2,3,5,1,2,2,7,6);
8282

8383
List<List<Integer>> list1 = Lists.partition(list,3);
84+
8485
print(list1);
8586
return list;
8687
}
@@ -89,10 +90,11 @@ private static List<String> testString() {
8990
// 字符串处理
9091
//
9192
List<String> lists = Lists.newArrayList("a","b","g","8","9");
93+
9294
String result = Joiner.on(",").join(lists);
9395
System.out.println(result);
9496

95-
String test = "34344,34,34,哈哈";
97+
String test = "34344,,,34,34,哈哈";
9698
lists = Splitter.on(",").splitToList(test);
9799
System.out.println(lists);
98100
return lists;
@@ -111,7 +113,7 @@ public static class AEvent{
111113

112114
@Subscribe
113115
public void handle(AEvent ae){
114-
System.out.println(ae.student + " is running.");
116+
System.out.println(Thread.currentThread().getName()+" "+ae.student + " is running.");
115117
}
116118

117119

04fx/java8/src/main/java/io/kimmking/java8/LambdaDemo.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,20 @@ public Integer operation(int a, int b) {
1717
};
1818

1919
MathOperation op1 = (a, b) -> 1;
20+
21+
22+
MathOperation op2 = new MathOperation<Integer>() {
23+
@Override
24+
public Integer operation(int a, int b) {
25+
return a+b;
26+
}
27+
};
2028

2129
// 类型声明
2230
MathOperation addition = (int a, int b) -> a + b;
2331

2432
// 不用类型声明
25-
MathOperation subtraction = (a, b) -> a - b + 1.0;
33+
MathOperation subtraction = (int a, int b) -> a - b + 1.0;
2634

2735
// 大括号中的返回语句
2836
MathOperation multiplication = (int a, int b) -> {
@@ -47,9 +55,10 @@ public Integer operation(int a, int b) {
4755
System.out.println("Hello " + message);
4856

4957
// 用括号
50-
GreetingService greetService2 = (message) ->
51-
System.out.println("Hello " + message);
52-
58+
GreetingService greetService2 = (message) -> {
59+
System.out.println(message);
60+
};
61+
5362
GreetingService greetService3 = System.out::println;
5463

5564
Arrays.asList(1,2,3).forEach( x -> System.out.println(x+3));

04fx/java8/src/main/java/io/kimmking/java8/LombokDemo.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
package io.kimmking.java8;
22

33
import lombok.extern.java.Log;
4+
import org.slf4j.LoggerFactory;
45

56
import java.io.IOException;
67

78
@Log
89
public class LombokDemo {
9-
10+
1011
public static void main(String[] args) throws IOException {
11-
12+
13+
A a = new A(1, "KK");
14+
System.out.println(a.toString());
15+
A.builder().age(1).name("KKK").build();
16+
1217
new LombokDemo().demo();
1318

1419
Student student1 = new Student();
@@ -17,6 +22,7 @@ public static void main(String[] args) throws IOException {
1722
System.out.println(student1.toString());
1823

1924
Student student2 = new Student(2, "KK02");
25+
//student2.init();
2026
System.out.println(student2.toString());
2127
}
2228

04fx/java8/src/main/java/io/kimmking/java8/StreamDemo.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,7 @@
33
import com.alibaba.fastjson.JSON;
44

55
import java.io.IOException;
6-
import java.util.Arrays;
7-
import java.util.LinkedHashMap;
8-
import java.util.List;
9-
import java.util.Map;
10-
import java.util.Optional;
6+
import java.util.*;
117
import java.util.stream.Collectors;
128

139
public class StreamDemo {
@@ -19,14 +15,14 @@ public static void main(String[] args) throws IOException {
1915

2016
// Optional
2117
Optional<Integer> first = list.stream().findFirst();
22-
18+
2319
System.out.println(first.map(i -> i * 100).orElse(100));
2420

2521
int sum = list.stream().filter( i -> i<4).distinct().reduce(0,(a,b)->a+b);
2622
System.out.println("sum="+sum);
2723

28-
//Map map = list.stream().collect(Collectors.toMap(a->a,a->(a+1)));
29-
Map<Integer,Integer> map = list.parallelStream().collect(Collectors.toMap(a->a,a->(a+1),(a,b)->a, LinkedHashMap::new));
24+
//Map map1 = list.stream().collect(Collectors.toMap(a->a,a->(a+1)));
25+
Map<Integer,Integer> map = list.stream().parallel().collect(Collectors.toMap(a->a,a->(a+1),(a,b)->a, LinkedHashMap::new));
3026
print(map);
3127

3228

0 commit comments

Comments
 (0)