Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
4580fc5
update
kimmking Nov 4, 2020
a19fa69
udpate 0302
kimmking Nov 5, 2020
5762222
update 0302
kimmking Nov 5, 2020
e2097ab
update 0303
kimmking Nov 6, 2020
5080e60
add homework 0303
kimmking Nov 6, 2020
46835e7
add homework 0303
kimmking Nov 6, 2020
436102c
update 0303
kimmking Nov 7, 2020
524adb2
Create homework2.0.md
kimmking Nov 11, 2020
5f15b4a
Update homework2.0.md
kimmking Nov 11, 2020
b9bd39e
update spring01
kimmking Nov 12, 2020
8ed0787
Merge branch 'main' of https://github.com/kimmking/JavaCourseCodes in…
kimmking Nov 12, 2020
7e46a63
一二三周作业简单示例
renfufei Nov 12, 2020
60d2f74
第3周作业简单实现
renfufei Nov 12, 2020
deb84b8
update 4.1
kimmking Nov 12, 2020
4ec3317
Merge branch 'main' of https://github.com/kimmking/JavaCourseCodes in…
kimmking Nov 12, 2020
3e3e698
add spring boot
kimmking Nov 14, 2020
ae4a252
update
kimmking Nov 17, 2020
45d3bf2
update java8
kimmking Nov 19, 2020
49da3e2
remove target
kimmking Nov 19, 2020
6d921f5
update
kimmking Dec 7, 2020
3a852c8
add rpc
kimmking Dec 12, 2020
d360a51
complete
kimmking Dec 12, 2020
714088e
update homeworks
kimmking Dec 12, 2020
ef939af
refactoring for fx and biz
kimmking Dec 12, 2020
7fc6668
update dubbo demo
kimmking Dec 12, 2020
02c958a
update
kimmking Dec 17, 2020
c163ed9
add zk
kimmking Dec 18, 2020
cde9d3a
update comment
kimmking Dec 18, 2020
6338a8f
add cache for mybatis
kimmking Dec 27, 2020
4768759
update
kimmking Dec 27, 2020
11a72bd
update
kimmking Dec 28, 2020
d5a8f4a
add sql
kimmking Dec 28, 2020
badd48d
update
kimmking Dec 28, 2020
8e18480
update 23
kimmking Dec 30, 2020
014efe3
update redission
kimmking Dec 30, 2020
45e80a8
update
kimmking Dec 30, 2020
24aff72
udpate
kimmking Dec 30, 2020
bb818e2
update
kimmking Dec 30, 2020
25a4ab5
update
kimmking Jan 7, 2021
d9d3590
update
kimmking Jan 7, 2021
8c2e70a
update
kimmking Jan 9, 2021
6da62e9
update
kimmking Jan 9, 2021
e78e6c1
udpate
kimmking Jan 9, 2021
8c88059
add mq 01
kimmking Jan 10, 2021
9562ea0
add README
kimmking Jan 10, 2021
72edf3a
udpate
kimmking Jan 10, 2021
5ccaac9
add mq demo
kimmking Jan 14, 2021
a279778
update
kimmking Jan 14, 2021
9a30cc5
add rocketmq demo
kimmking Jan 14, 2021
dbd14b1
add netty demo
kimmking Jan 17, 2021
6058224
add router for gateway
kimmking Jan 20, 2021
3809b42
update backend
kimmking Jan 20, 2021
b63161e
update
kimmking Jan 20, 2021
4f4ed28
update
kimmking Jan 20, 2021
ee52288
add response filter
kimmking Jan 20, 2021
bf86c46
update TestAddUrl
kimmking Jan 21, 2021
b01f882
update
kimmking Jan 24, 2021
502df42
update
kimmking Jan 24, 2021
2cd9ac8
udpate childOption
kimmking Jan 24, 2021
f3f6632
update
kimmking Jan 24, 2021
68af61f
update
kimmking Jan 28, 2021
01903e4
update
kimmking Feb 3, 2021
fa2aa23
add BeanPostProcessor
kimmking Feb 3, 2021
b26bd71
update
kimmking Feb 10, 2021
8eefc19
update homework2.0
kimmking Feb 17, 2021
36f9176
update homework2.0
kimmking Feb 17, 2021
672a304
update homework2.0
kimmking Feb 17, 2021
0d2545f
第1周-作业1(选做)
renfufei Apr 24, 2021
53e84fc
第一周 - 作业3(必做)
renfufei Apr 25, 2021
0b8b5ca
第一周 - 作业4.(选做)
renfufei Apr 25, 2021
57f0b79
第一周-作业5.(选做)
renfufei Apr 25, 2021
a2e6c0c
GCLogAnalysis
renfufei Apr 25, 2021
4837b4e
更多资料
renfufei Apr 27, 2021
5339cb7
第二周-作业6.(必做)
renfufei May 16, 2021
155f2b5
Week02 作业
renfufei May 16, 2021
201be61
update
kimmking Jun 21, 2021
ec84c8d
fix -Xms512 to -Xms512m
loodeer Jun 22, 2021
dccd797
Merge pull request #17 from loodeer/patch-1
kimmking Jun 25, 2021
6943786
部分: 第7周作业-第8周作业
renfufei Sep 19, 2021
21f061f
第七周-作业2- 部分
renfufei Sep 22, 2021
99903cc
add fastdfs
kimmking Mar 5, 2022
9a9fec6
Merge branch 'gmain' into main
kimmking Mar 6, 2022
b424f7f
add fastdfs
kimmking Mar 5, 2022
7017134
add dtx01
kimmking Mar 23, 2022
8b854ed
Merge branch 'main' into gmain
kimmking Mar 23, 2022
ad0fa06
move
renfufei Apr 3, 2022
95dcfbb
Create 作业注意事项.md
renfufei Sep 8, 2022
647cc63
add some test codes
kimmking Oct 2, 2022
4f8c3c6
add some test codes
kimmking Oct 2, 2022
be5d0d2
update rpc02 and add spring04
kimmking Oct 21, 2022
b0f2bc7
Merge branch 'main' into gmain
kimmking Oct 21, 2022
ccd1eb5
valiate jdbc generated keys when insert into on duplicate key update …
kimmking Oct 21, 2022
588dc3f
polish jvm demo
kimmking Oct 29, 2022
e05c096
add xlass
kimmking Oct 29, 2022
aebe322
update
kimmking Oct 29, 2022
2ea655a
add hello method
kimmking Oct 30, 2022
9e7c762
add comments
kimmking Oct 30, 2022
962bd12
add JOL demo
kimmking Oct 30, 2022
45cf133
update
kimmking Nov 18, 2022
a378db1
add multiple beans registrar
kimmking Nov 29, 2022
e84d39f
add registrar
kimmking Dec 23, 2022
6ebd3b2
complete registy for zk
kimmking Jan 1, 2024
c6a07a3
remove some sout
kimmking Jan 1, 2024
8d5ea10
remove some sout
kimmking Jan 1, 2024
8afa0eb
remove some sout
kimmking Jan 1, 2024
42fe0c8
add connectionPool
kimmking Jan 12, 2024
04090c9
refactor RPC and Registry
kimmking Jan 13, 2024
c7c24d0
compelet kk registry integration
kimmking Apr 14, 2024
beddc69
update some config
kimmking Apr 14, 2024
ef42a2b
polish codes
kimmking Apr 15, 2024
9f00f9e
add file store
kimmking Jun 25, 2024
58bb7d3
update ignore
kimmking Jun 25, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 8 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,11 @@
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
*.iml
*.idea/
*.idea/

out/
classes/
target/
build/

.DS_Store
24 changes: 24 additions & 0 deletions 01jvm/AnalysisForList.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
public class AnalysisForList {

private int[] array = new int[] {1,2,3};

public void testFor() {
for (int i : array) {
System.out.println(i);
}
}

public void testForIndex() {
for (int i=0;i<array.length;i++) {
System.out.println(array[i]);
}
}

public void testForIndex01() {
int len = array.length;
for (int i=0;i<len;i++) {
System.out.println(array[i]);
}
}

}
7 changes: 7 additions & 0 deletions 01jvm/HelloByteCode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
public class HelloByteCode {

public static void main(String[] args) {
System.out.println(new HelloByteCode());
}

}
17 changes: 17 additions & 0 deletions 01jvm/HelloNum.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
public class HelloNum {
public static void main(String[] args) {
int num1 = 1; // 字面量1;
double num2 = 2.0D; // 大小写的D都可以
long num3 = 3L; // 大小写的L都可以, 加L是好习惯;
byte num4 = 4; // 可以直接赋予 [-128, 127] 范围内的字面量;
if ("".length() < 10) {
// 错误用法: num2 + num3 = 2.03
System.out.println("错误用法: num2 + num3 = " + num2 + num3);
}
for (int i = 0; i < num1; i++) {
// 四则运算: num1 * num4 = 4
System.out.print("四则运算: num1 * num4 = ");
System.out.println(num1 * num4);
}
}
}
62 changes: 62 additions & 0 deletions 01jvm/JvmClassLoaderPrintPath.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.List;

public class JvmClassLoaderPrintPath {

public static void main(String[] args) {

// 启动类加载器
URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
System.out.println("启动类加载器");
for (URL url : urls) {
System.out.println(" ===> " + url.toExternalForm());
}

// 扩展类加载器
printClassloader("扩展类加载器",JvmClassLoaderPrintPath.class.getClassLoader().getParent());

// 应用类加载器
printClassloader("应用类加载器",JvmClassLoaderPrintPath.class.getClassLoader());

}

private static void printClassloader(String name, ClassLoader classLoader) {
System.out.println();
if (null != classLoader) {
System.out.println(name + " Classloader -> " + classLoader.toString());
printURLForClassloader(classLoader);
} else {
System.out.println(name + " Classloader -> null");
}
}

private static void printURLForClassloader(ClassLoader classLoader) {
Object ucp = insightField(classLoader,"ucp");
Object path = insightField(ucp,"path");
List paths = (List) path;
for (Object p : paths) {
System.out.println(" ===> " + p.toString());
}
}

private static Object insightField(Object obj, String fName) {
Field f = null;
try {
if (obj instanceof URLClassLoader) {
f = URLClassLoader.class.getDeclaredField(fName);
} else {
f = obj.getClass().getDeclaredField(fName);
}
f.setAccessible(true);
return f.get(obj);
}
catch (Exception ex) {
ex.printStackTrace();
}
return null;
}


}
149 changes: 149 additions & 0 deletions 01jvm/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
# 第1周作业


参见 我的教室 -> 本周作业

## 作业内容


> Week01 作业题目:

1.(必做)自己写一个简单的 HelloNum.java,里面需要涉及基本类型,四则运行,if 和 for,然后自己分析一下对应的字节码,有问题群里讨论。

2.(必做)自定义一个 Classloader,加载一个 Hello.xlass 文件,执行 hello 方法,此文件内容是一个 Hello.class 文件所有字节(x=255-x)处理后的文件。文件群里提供。

3.(必做)画一张图,展示 Xmx、Xms、Xmn、Meta、DirectMemory、Xss 这些内存参数的关系。

4.(选做)检查一下自己维护的业务系统的 JVM 参数配置,用 jstat 和 jstack、jmap 查看一下详情,并且自己独立分析一下大概情况,思考有没有不合理的地方,如何改进。

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

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



## 操作步骤


### 作业1(必做)

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


### 作业2(必做)

1. 打开 Spring 官网: https://spring.io/
2. 找到 Projects --> Spring Initializr: https://start.spring.io/
3. 填写项目信息, 生成 maven 项目; 下载并解压。
4. Idea或者Eclipse从已有的Source导入Maven项目。
5. 从课件资料中找到资源 Hello.xlass 文件并复制到 src/main/resources 目录。
6. 编写代码,实现 findClass 方法,以及对应的解码方法
7. 编写main方法,调用 loadClass 方法;
8. 创建实例,以及调用方法
9. 执行.

具体代码可参考: [XlassLoader.java](./XlassLoader.java)


### 作业3(必做)

对应的图片需要各位同学自己绘制,可以部分参考PPT课件。

提示:

- Xms 设置堆内存的初始值
- Xmx 设置堆内存的最大值
- Xmn 设置堆内存中的年轻代的最大值
- Meta 区不属于堆内存, 归属为非堆
- DirectMemory 直接内存, 属于 JVM 内存中开辟出来的本地内存空间。
- Xss设置的是单个线程栈的最大空间;

JVM进程空间中的内存一般来说包括以下这些部分:

- 堆内存(Xms ~ Xmx) = 年轻代(~Xmn) + 老年代
- 非堆 = Meta + CodeCache + ...
- Native内存 = 直接内存 + Native + ...
- 栈内存 = n * Xss

另外,注意区分规范与实现的区别, 需要根据具体实现以及版本, 才能确定。 一般来说,我们的目的是为了排查故障和诊断问题,大致弄清楚这些参数和空间的关系即可。 具体设置时还需要留一些冗余量。


### 4.(选做)

这个是具体案例分析, 请各位同学自己分析。

比如我们一个生产系统应用的启动参数为:

```
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
```

另一个系统的启动参数为:

```
JAVA_OPTS=-Xmx4g -Xms4g -XX:+UseG1GC -XX:MaxGCPauseMillis=50
```

具体如何设置, 需要考虑的因素包括:

- 系统容量: 业务规模, 并发, 成本预算; 需要兼顾性能与成本;
- 延迟要求: 最坏情况下能接受多少时间的延迟尖刺。
- 吞吐量: 根据业务特征来确定, 比如, 网关, 大数据底层平台, 批处理作业系统, 在线实时应用, 他们最重要的需求不一样。
- 系统架构: 比如拆分为小内存更多节点, 还是大内存少量节点。
- 其他...


### 5.(选做)

例如使用以下命令:

```
# 编译
javac -g GCLogAnalysis.java
# JDK8 启动程序
java -Xmx2g -Xms2g -XX:+UseG1GC -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:gc.log GCLogAnalysis
```

尝试使用课程中介绍的各种工具JDK命令行和图形工具来进行分析。

其中 [GCLogAnalysis.java](./GCLogAnalysis.java) 文件也可以从课件资料zip中找到.

## 几个命令用法
### 1、十六进制方式查看文件
`hexdump -C Hello.class`
输出:`00000000 ca fe ba be 00 00 00 34 00 1c 0a 00 06 00 0e 09`

可以看到magic number: `cafe babe`,
以及`00 00 00 34`,十六进制34=十进制3*16+4=52,这是jdk8,如果是jdk11则是55,十六进制37.

### 2、Base64方式编码文件
`base64 Hello.class`
### 3、显示JVM默认参数
```
java -XX:+PrintFlagsFinal -version

java -XX:+PrintFlagsFinal -version | grep -F " Use" | grep -F "GC "

java -XX:+PrintFlagsFinal -version | grep MaxNewSize

```

### 4、切换不同jdk
```
jenv shell 1.8
jenv shell 11
```
显示所有jdk
```
jenv versions
```

## 更多资料

更多中英文的技术文章和参考资料: <https://github.com/cncounter/translation>

22 changes: 22 additions & 0 deletions 01jvm/TestAddUrl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class TestAddUrl {

public static void main(String[] args) throws Exception {
URLClassLoader classLoader = (URLClassLoader) TestAddUrl.class.getClassLoader();
String dir = "./lib";
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
method.setAccessible(true);
method.invoke(classLoader, new File(dir).getAbsoluteFile().toURL());

Class klass = Class.forName("HelloKimmking",true, classLoader);
Object obj = klass.newInstance();
Method hello = klass.getDeclaredMethod("hello");
hello.invoke(obj);
}

}
75 changes: 75 additions & 0 deletions 01jvm/XlassLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;

/*
第一周作业:
2.(必做)自定义一个 Classloader,加载一个 lib.Hello.xlass 文件,执行 hello 方法,此文件内容是一个 lib.Hello.class 文件所有字节(x=255-x)处理后的文件。文件群里提供。
*/
public class XlassLoader extends ClassLoader {

public static void main(String[] args) throws Exception {
// 相关参数
final String packageName = "lib";
final String className = "Hello";
final String methodName = "hello";
// 创建类加载器
ClassLoader classLoader = new XlassLoader();
// 加载相应的类
Class<?> clazz = classLoader.loadClass(packageName + "." + className);
// 看看里面有些什么方法
for (Method m : clazz.getDeclaredMethods()) {
System.out.println(clazz.getSimpleName() + "." + m.getName());
}
// 创建对象
Object instance = clazz.getDeclaredConstructor().newInstance();
// 调用实例方法
Method method = clazz.getMethod(methodName);
method.invoke(instance);
}

@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// 如果支持包名, 则需要进行路径转换
String resourcePath = name.replace(".", "/");
// 文件后缀
final String suffix = ".xlass";
// 获取输入流
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(resourcePath + suffix);
try {
// 读取数据
int length = inputStream.available();
byte[] byteArray = new byte[length];
inputStream.read(byteArray);
// 转换
byte[] classBytes = decode(byteArray);
// 通知底层定义这个类
return defineClass(name, classBytes, 0, classBytes.length);
} catch (IOException e) {
throw new ClassNotFoundException(name, e);
} finally {
close(inputStream);
}
}

// 解码
private static byte[] decode(byte[] byteArray) {
byte[] targetArray = new byte[byteArray.length];
for (int i = 0; i < byteArray.length; i++) {
targetArray[i] = (byte) (255 - byteArray[i]);
}
return targetArray;
}

// 关闭
private static void close(Closeable res) {
if (null != res) {
try {
res.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
22 changes: 22 additions & 0 deletions 01jvm/jvm/HelloClassLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package jvm;

import java.util.Base64;

public class HelloClassLoader extends ClassLoader {

public static void main(String[] args) throws Exception {

new HelloClassLoader().findClass("lib.Hello").newInstance();
}

@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
String helloBase64 = "yv66vgAAADQAHwoABwAQCQARABIIABMKABQAFQgAFgcAFwcAGAEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBAAVoZWxsbwEACDxjbGluaXQ+AQAKU291cmNlRmlsZQEACkhlbGxvLmphdmEMAAgACQcAGQwAGgAbAQAdSGVsbG8gY2xhc3Mgc2F5IGhlbGxvIG1ldGhvZC4HABwMAB0AHgEAGEhlbGxvIENsYXNzIEluaXRpYWxpemVkIQEACWxpYi9IZWxsbwEAEGphdmEvbGFuZy9PYmplY3QBABBqYXZhL2xhbmcvU3lzdGVtAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07AQATamF2YS9pby9QcmludFN0cmVhbQEAB3ByaW50bG4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYAIQAGAAcAAAAAAAMAAQAIAAkAAQAKAAAAHQABAAEAAAAFKrcAAbEAAAABAAsAAAAGAAEAAAADAAEADAAJAAEACgAAACUAAgABAAAACbIAAhIDtgAEsQAAAAEACwAAAAoAAgAAAAgACAAJAAgADQAJAAEACgAAACUAAgAAAAAACbIAAhIFtgAEsQAAAAEACwAAAAoAAgAAAAUACAAGAAEADgAAAAIADw==+AQAKU291cmNlRmlsZQEACkhlbGxvLmphdmEMAAgACQcAGQwAGgAbAQAdSGVsbG8gY2xhc3Mgc2F5IGhlbGxvIG1ldGhvZC4HABwMAB0AHgEAGEhlbGxvIENsYXNzIEluaXRpYWxpemVkIQEACWxpYi9IZWxsbwEAEGphdmEvbGFuZy9PYmplY3QBABBqYXZhL2xhbmcvU3lzdGVtAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07AQATamF2YS9pby9QcmludFN0cmVhbQEAB3ByaW50bG4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYAIQAGAAcAAAAAAAMAAQAIAAkAAQAKAAAAHQABAAEAAAAFKrcAAbEAAAABAAsAAAAGAAEAAAADAAEADAAJAAEACgAAACUAAgABAAAACbIAAhIDtgAEsQAAAAEACwAAAAoAAgAAAAgACAAJAAgADQAJAAEACgAAACUAAgAAAAAACbIAAhIFtgAEsQAAAAEACwAAAAoAAgAAAAUACAAGAAEADgAAAAIADw==";
byte[] bytes = decode(helloBase64);
return defineClass(name,bytes,0,bytes.length);
}

public byte[] decode(String base64) {
return Base64.getDecoder().decode(base64);
}
}
Loading