diff --git a/_config.butterfly.yml b/_config.butterfly.yml index 330494f..13af49a 100644 --- a/_config.butterfly.yml +++ b/_config.butterfly.yml @@ -11,16 +11,16 @@ nav: menu: 首页: / || fas fa-home 留言板: /contact/ || fas fa-comments - NAS基础: /categories/nasbase/ || fas fa-cube - NAS服务: /categories/nasservice/ || fas fa-server + NAS技术: /categories/nas/ || fas fa-server +# NAS从零开始: /categories/fromzero/ || fas fa-cube # 标签: /tags/ || fas fa-tags # 文章归档: /archives || fas fa-archive 分类||fas fa-archive: + 技术随笔: /categories/other/ Linux基础: /categories/linux/ 网络基础: /categories/network/ - NAS基础: /categories/nasbase/ - NAS服务: /categories/nasservice/ - 技术随笔: /categories/other/ + NAS技术: /categories/nas/ + NAS从零开始: /categories/fromzero/ 工具||fas fa-wrench: 网站导航: https://nav.dreamlyn.cn B站字幕转换: /html/bsrt.html diff --git a/_config.yml b/_config.yml index 05a9eb8..8f4a09f 100644 --- a/_config.yml +++ b/_config.yml @@ -72,8 +72,8 @@ default_category: uncategorized category_map: Linux基础: linux 网络基础: network - NAS基础: nasbase - NAS服务: nasservice + NAS技术: nas + NAS从零开始: fromzero 技术随笔: other tag_map: diff --git a/source/_posts/fromzero/使用VirtualBox虚拟机安装群晖系统.md b/source/_posts/fromzero/使用VirtualBox虚拟机安装群晖系统.md new file mode 100644 index 0000000..2a8b6f7 --- /dev/null +++ b/source/_posts/fromzero/使用VirtualBox虚拟机安装群晖系统.md @@ -0,0 +1,166 @@ +--- +title: 使用VirtualBox虚拟机安装群晖7.1系统 +abbrlink: 1751037144 +date: 2024-04-03 11:10:00 +tags: +categories: +keywords: +description: +cover: +--- +>VirtualBox为开源软件,较Vmware更加轻量,在此推荐使用VirtualBox来安装群晖系统。 +>本文主要介绍群晖(DS920+)在VirtualBox虚拟机上的详细安装教程。 + +# 下载并安装VirtualBox + +到[VirtualBox官网](https://www.virtualbox.org/wiki/Downloads)下载最新版的VirtualBox,安装时如图一路下一步即可。 +看到如下界面表示安装完成。 + + + + + +# 下载群晖引导 + +在此给出目前最新版群晖引导的[下载地址](https://oss.dreamlyn.cn/nas/黑群晖/arpl-zh_CN-1.1-beta2a.vmdk-flat.zip)。 + +# 添加虚拟机 + +如图在系统中找打合适的位置创建NAS目录,解压刚才下载的群晖引导,并将里面的内容拷贝到创建的目录。 + + + +打开VirtualBox,点击`新建`创建虚拟机。 + + + +如图,名字随便起,文件夹选择刚才创建的文件夹,类型选Linux,版本选Other Linux(64-bit) + + + +硬件部分按需选择,这里我内存设置4G,cpu4核。 + + + +虚拟硬盘处选择使用已有的虚拟硬盘文件。 + + + +在弹出的框中点击注册 + + + +随后找到先前创建的目录并选择`arpl.vmdk` + + + +点击完成 + + + +随后再对虚拟机进行配置,点击设置。 + + + +选择存储后,点击添加虚拟硬盘,这块新加的虚拟硬盘是真正安装存储群晖系统的地方,应适当大一些。 + + + +点击创建,选择VDI(VirtualBox磁盘映像)并点击下一步。 + + + +点击下一步 + + + +设置磁盘大小并点击完成。 + + + +选中刚才创建的磁盘并点击选择。 + + + + +点击网络,将网络连接设置成桥接模式。 + + + +随后点击确定并在主界面点击启动 + + + +# 配置并启动引导 + +点击启动后,稍等片刻,在如下界面按下回车键开始对引导进行配置。 + + + +看到如下配置后,说明引导已正常启动。 + + + +我们在浏览器中输入红框框出来的地址,`192.168.31.119:7681`进入如下界面。 + + + +选中选择型号并回车,在转到的界面中选择DS920+ + + + +随后选择版本,这里选择42661 + + + +选择SN码,直接选择生成随机SN。 + + + +在插件中选择添加插件并添加`cpuinfo`插件 + + + +插件的加载参数为空,确认 + + + +随后直接选中编译引导并回车,待编译完成后选中启动并回车。 + + + +# 安装群晖系统 + +下载群晖助手并安装启动,[下载地址](https://template-mine.oss-cn-beijing.aliyuncs.com/nas/blog/synology-assistant-7.0.3-50049.exe) + +如图,扫描群晖系统(期间可能需要关闭防火墙)。 + + + +找到DSM未安装的那个就是刚才用虚拟机安装的NAS,我们用浏览器访问对应的IP地址`http://192.168.31.119:5000/`进入如下界面,点击安装。 + + + +从以下链接下载DSM系统 + +``` +https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_DS920%2B_42661.pat +``` + +点击浏览,并选择刚才下载的DSM系统,点击下一步。 + + + +点继续。 + + + +随后进入安装界面,待进度走到100%后,我们就完成了虚拟机中群晖系统的安装。 + + + + + + + + diff --git a/source/_posts/nasserver/NAS中安装Traefik.md b/source/_posts/nas/NAS中安装Traefik.md similarity index 99% rename from source/_posts/nasserver/NAS中安装Traefik.md rename to source/_posts/nas/NAS中安装Traefik.md index f0eeab4..d6ac87f 100644 --- a/source/_posts/nasserver/NAS中安装Traefik.md +++ b/source/_posts/nas/NAS中安装Traefik.md @@ -4,7 +4,7 @@ tags: - 网络 - NAS技术 - 反向代理 -categories: NAS服务 +categories: NAS技术 description: NAS中安装Traefik作反向代理 abbrlink: 2636364671 date: 2023-02-30 11:02:22 diff --git a/source/_posts/nasserver/NAS中安装docker-compose.md b/source/_posts/nas/NAS中安装docker-compose.md similarity index 97% rename from source/_posts/nasserver/NAS中安装docker-compose.md rename to source/_posts/nas/NAS中安装docker-compose.md index b734fdf..fe48b2c 100644 --- a/source/_posts/nasserver/NAS中安装docker-compose.md +++ b/source/_posts/nas/NAS中安装docker-compose.md @@ -4,7 +4,7 @@ tags: - docker - NAS技术 - 反向代理 -categories: NAS服务 +categories: NAS技术 description: abbrlink: 3251282051 date: 2024-02-28 8:02:22 diff --git a/source/_posts/nasserver/NAS中安装npm.md b/source/_posts/nas/NAS中安装npm.md similarity index 98% rename from source/_posts/nasserver/NAS中安装npm.md rename to source/_posts/nas/NAS中安装npm.md index c6565a4..854b117 100644 --- a/source/_posts/nasserver/NAS中安装npm.md +++ b/source/_posts/nas/NAS中安装npm.md @@ -4,7 +4,7 @@ tags: - docker - NAS技术 - 反向代理 -categories: NAS服务 +categories: NAS技术 description: NAS中安装nginx proxy manager作反向代理 abbrlink: 4049218885 date: 2024-02-28 11:02:22 diff --git a/source/_posts/nasbase/NAS使用DDNS.md b/source/_posts/nas/NAS使用DDNS.md similarity index 99% rename from source/_posts/nasbase/NAS使用DDNS.md rename to source/_posts/nas/NAS使用DDNS.md index b8c7bd4..7ffbfcc 100644 --- a/source/_posts/nasbase/NAS使用DDNS.md +++ b/source/_posts/nas/NAS使用DDNS.md @@ -3,7 +3,7 @@ title: NAS使用DDNS tags: - 网络 - NAS技术 -categories: NAS基础 +categories: NAS技术 abbrlink: 28082 date: 2023-08-22 11:02:22 keywords: diff --git a/source/_posts/nasserver/NAS使用timymediamanager刮削海报.md b/source/_posts/nas/NAS使用timymediamanager刮削海报.md similarity index 99% rename from source/_posts/nasserver/NAS使用timymediamanager刮削海报.md rename to source/_posts/nas/NAS使用timymediamanager刮削海报.md index 8ed84fe..809c09e 100644 --- a/source/_posts/nasserver/NAS使用timymediamanager刮削海报.md +++ b/source/_posts/nas/NAS使用timymediamanager刮削海报.md @@ -5,7 +5,7 @@ date: 2024-02-29 14:22:51 tags: - NAS技术 - 影音系统 -categories: NAS服务 +categories: NAS技术 keywords: description: cover: diff --git a/source/_posts/nasbase/NAS双网口改桥接模式.md b/source/_posts/nas/NAS双网口改桥接模式.md similarity index 99% rename from source/_posts/nasbase/NAS双网口改桥接模式.md rename to source/_posts/nas/NAS双网口改桥接模式.md index c1a346c..8254015 100644 --- a/source/_posts/nasbase/NAS双网口改桥接模式.md +++ b/source/_posts/nas/NAS双网口改桥接模式.md @@ -3,7 +3,7 @@ title: NAS双网口改桥接模式 tags: - 网络 - NAS技术 -categories: NAS基础 +categories: NAS技术 abbrlink: 3026110258 date: 2024-02-22 11:02:22 keywords: diff --git a/source/_posts/nasserver/Nastool中IYUU插件问题修复.md b/source/_posts/nas/Nastool中IYUU插件问题修复.md similarity index 95% rename from source/_posts/nasserver/Nastool中IYUU插件问题修复.md rename to source/_posts/nas/Nastool中IYUU插件问题修复.md index 9f59edf..2c559f2 100644 --- a/source/_posts/nasserver/Nastool中IYUU插件问题修复.md +++ b/source/_posts/nas/Nastool中IYUU插件问题修复.md @@ -5,7 +5,7 @@ tags: - NAS技术 - 影音系统 - PT -categories: NAS服务 +categories: NAS技术 description: abbrlink: 4049218886 date: 2024-03-08 11:02:22 diff --git a/source/_posts/nasbase/Traefik将acme.json 分割成证书.md b/source/_posts/nas/Traefik将acme.json 分割成证书.md similarity index 98% rename from source/_posts/nasbase/Traefik将acme.json 分割成证书.md rename to source/_posts/nas/Traefik将acme.json 分割成证书.md index b1b5ce4..3059710 100644 --- a/source/_posts/nasbase/Traefik将acme.json 分割成证书.md +++ b/source/_posts/nas/Traefik将acme.json 分割成证书.md @@ -2,7 +2,7 @@ title: Traefik将acme.json 分割成证书 tags: - 网络 -categories: NAS基础 +categories: NAS技术 abbrlink: 60950 date: 2023-06-22 11:02:22 keywords: diff --git a/source/_posts/nasserver/使用frp进行内网穿透.md b/source/_posts/nas/使用frp进行内网穿透.md similarity index 99% rename from source/_posts/nasserver/使用frp进行内网穿透.md rename to source/_posts/nas/使用frp进行内网穿透.md index 485eabf..e130a2c 100644 --- a/source/_posts/nasserver/使用frp进行内网穿透.md +++ b/source/_posts/nas/使用frp进行内网穿透.md @@ -3,7 +3,7 @@ title: 使用frp进行内网穿透 tags: - 网络 - NAS技术 -categories: NAS服务 +categories: NAS技术 abbrlink: 25460 date: 2023-02-25 11:02:22 keywords: diff --git a/source/_posts/nasbase/外网访问NAS.md b/source/_posts/nas/外网访问NAS.md similarity index 99% rename from source/_posts/nasbase/外网访问NAS.md rename to source/_posts/nas/外网访问NAS.md index f879018..2827279 100644 --- a/source/_posts/nasbase/外网访问NAS.md +++ b/source/_posts/nas/外网访问NAS.md @@ -3,7 +3,7 @@ title: 外网访问NAS tags: - 网络 - NAS技术 -categories: NAS基础 +categories: NAS技术 abbrlink: 4218199689 date: 2024-02-22 11:02:22 keywords: diff --git a/source/_posts/nasserver/威联通NAS安装旁路由.md b/source/_posts/nas/威联通NAS安装旁路由.md similarity index 99% rename from source/_posts/nasserver/威联通NAS安装旁路由.md rename to source/_posts/nas/威联通NAS安装旁路由.md index 3a2c361..122f5c0 100644 --- a/source/_posts/nasserver/威联通NAS安装旁路由.md +++ b/source/_posts/nas/威联通NAS安装旁路由.md @@ -3,7 +3,7 @@ title: 威联通NAS安装旁路由 tags: - 网络 - NAS技术 -categories: NAS服务 +categories: NAS技术 abbrlink: 34692 date: 2022-02-26 11:02:22 keywords: diff --git a/source/_posts/nasbase/将花生壳域名的服务商改为DNSPod.md b/source/_posts/nas/将花生壳域名的服务商改为DNSPod.md similarity index 98% rename from source/_posts/nasbase/将花生壳域名的服务商改为DNSPod.md rename to source/_posts/nas/将花生壳域名的服务商改为DNSPod.md index fede94b..d786649 100644 --- a/source/_posts/nasbase/将花生壳域名的服务商改为DNSPod.md +++ b/source/_posts/nas/将花生壳域名的服务商改为DNSPod.md @@ -2,7 +2,7 @@ title: 将花生壳域名的服务商改为DNSPod tags: - 网络 -categories: NAS基础 +categories: NAS技术 abbrlink: 40925 date: 2022-03-21 11:02:22 keywords: diff --git a/source/_posts/nasbase/找不到群晖NAS的解决办法.md b/source/_posts/nas/找不到群晖NAS的解决办法.md similarity index 99% rename from source/_posts/nasbase/找不到群晖NAS的解决办法.md rename to source/_posts/nas/找不到群晖NAS的解决办法.md index aea489a..3fa1972 100644 --- a/source/_posts/nasbase/找不到群晖NAS的解决办法.md +++ b/source/_posts/nas/找不到群晖NAS的解决办法.md @@ -3,7 +3,7 @@ title: 找不到群晖NAS的解决办法 tags: - 网络 - NAS技术 -categories: NAS基础 +categories: NAS技术 abbrlink: 2241717723 date: 2023-02-22 11:02:22 keywords: diff --git a/source/_posts/nasbase/网络文件夹目前是以其他用户名和密码进行映射的.md b/source/_posts/nas/网络文件夹目前是以其他用户名和密码进行映射的.md similarity index 98% rename from source/_posts/nasbase/网络文件夹目前是以其他用户名和密码进行映射的.md rename to source/_posts/nas/网络文件夹目前是以其他用户名和密码进行映射的.md index ae3294d..e0f52e8 100644 --- a/source/_posts/nasbase/网络文件夹目前是以其他用户名和密码进行映射的.md +++ b/source/_posts/nas/网络文件夹目前是以其他用户名和密码进行映射的.md @@ -5,7 +5,7 @@ date: 2024-03-12 16:39:26 tags: - 网络 - NAS技术 -categories: NAS基础 +categories: NAS技术 keywords: description: 在使用局域网内的映射盘来访问NAS的共享文件夹时,发现无法映射成功,提示指定的网络文件夹目前是以其他用户名和密码进行映射的。在查找相关资料后找到问题的解决办法,在此做下记录。 cover: diff --git a/source/_posts/nasbase/群晖DSM降级教程.md b/source/_posts/nas/群晖DSM降级教程.md similarity index 99% rename from source/_posts/nasbase/群晖DSM降级教程.md rename to source/_posts/nas/群晖DSM降级教程.md index 8539f56..9cc6a9f 100644 --- a/source/_posts/nasbase/群晖DSM降级教程.md +++ b/source/_posts/nas/群晖DSM降级教程.md @@ -5,7 +5,7 @@ date: 2024-02-29 08:20:22 tags: - 网络 - NAS技术 -categories: NAS基础 +categories: NAS技术 keywords: description: cover: diff --git a/source/_posts/nasserver/群晖NAS安装旁路由.md b/source/_posts/nas/群晖NAS安装旁路由.md similarity index 99% rename from source/_posts/nasserver/群晖NAS安装旁路由.md rename to source/_posts/nas/群晖NAS安装旁路由.md index ca22a2b..ac9845b 100644 --- a/source/_posts/nasserver/群晖NAS安装旁路由.md +++ b/source/_posts/nas/群晖NAS安装旁路由.md @@ -3,7 +3,7 @@ title: 群晖NAS安装旁路由 tags: - 网络 - NAS技术 -categories: NAS服务 +categories: NAS技术 abbrlink: 43311 date: 2022-02-25 11:02:22 keywords: diff --git a/source/_posts/other/MySQL索引设计原则.md b/source/_posts/other/MySQL索引设计原则.md deleted file mode 100644 index 5baba0d..0000000 --- a/source/_posts/other/MySQL索引设计原则.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: MySQL索引设计原则 -tags: Java技术 -categories: 技术随笔 -abbrlink: 167789376 -date: 2024-03-14 16:40:20 -keywords: -description: -cover: ---- - -# 代码先行,索引后上 -一般应该等到主体业务功能开发完毕,把涉及到该表相关sql都要拿出来分析之后再建立索引。 - -# 联合索引尽量覆盖条件 -设计一个或者两三个联合索引(尽量少建单值索引),让每一个联合索引都尽量去包含sql语句里的where、order by、group by的字段,还要确保这些联合索引的字段顺序尽量满足sql查询的最左前缀原 则。 - -# 不要在小基数字段上建立索引 -索引基数是指这个字段在表里总共有多少个不同的值,比如一张表总共100万行记录,其中有个性别字段, 其值不是男就是女,那么该字段的基数就是2。 -如果对这种小基数字段建立索引的话,还不如全表扫描了,因为你的索引树里就包含男和女两种值,根本没法进行快速的二分查找,那用索引就没有太大的意义了。 -一般建立索引,尽量使用那些基数比较大的字段,就是值比较多的字段,那么才能发挥出B+树快速二分查找的优势来。 - -# 长字符串我们可以采用前缀索引 -尽量对字段类型较小的列设计索引,比如说什么tinyint之类的,因为字段类型较小的话,占用磁盘空间也会比较小,此时你在搜索的时候性能也会比较好一点。 -当然,这个所谓的字段类型小一点的列,也不是绝对的,很多时候你就是要针对varchar(255)这种字段建立索引,哪怕多占用一些磁盘空间也是有必要的。 -对于这种varchar(255)的大字段可能会比较占用磁盘空间,可以稍微优化下,比如针对这个字段的前20个字符建立索引,就是说,对这个字段里的每个值的前20个字符放在索引树里, -类似于 KEY index(name(20),age,position)。此时你在where条件里搜索的时候,如果是根据name字段来搜索,那么此时就会先到索引树里根据name -字段的前20个字符去搜索,定位到之后前20个字符的前缀匹配的部分数据之后,再回到聚簇索引提取出来完整的name字段值进行比对。 -但是假如你要是order by name,那么此时你的name因为在索引树里仅仅包含了前20个字符,所以这个排序是没法用上索引的, group by也是同理。所以这里大家要对前缀索引有一个了解。 - -# where与order by冲突时优先where -在where和order by出现索引设计冲突时,到底是针对where去设计索引,还是针对order by设计索引?到底是让where去用上索引,还是让order by用上索引? -一般这种时候往往都是让where条件去使用索引来快速筛选出来一部分指定的数据,接着再进行排序。 -因为大多数情况基于索引进行where筛选往往可以最快速度筛选出你要的少部分数据,然后做排序的成本可能会小很多。 - -# 基于慢sql查询做优化 -可以根据监控后台的一些慢sql,针对这些慢sql查询做特定的索引优化。 diff --git a/source/_posts/other/java中的类加载器.md b/source/_posts/other/java中的类加载器.md deleted file mode 100644 index 1825716..0000000 --- a/source/_posts/other/java中的类加载器.md +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: java中的类加载器 -tags: Java技术 -categories: 技术随笔 -abbrlink: 3639892104 -date: 2024-03-06 16:22:05 -keywords: -description: -cover: ---- -> java中的类加载器主要有三种: -> 引导类加载器 -> 扩展类加载器 -> 应用类加载器 - -# 通过代码了解类加载器 - -``` -public class TestJDKClassLoader { - public static void main(String[] args) { - //打印类加载器 - System.out.println(String.class.getClassLoader()); //不是java对象,打印null - System.out.println(DESKeyFactory.class.getClassLoader()); - System.out.println(TestJDKClassLoader.class.getClassLoader()); - //类加载器之间的关系 - System.out.println(); - ClassLoader appClassLoader = ClassLoader.getSystemClassLoader(); - ClassLoader extClassLoader = appClassLoader.getParent(); - ClassLoader bootstrapLoader = extClassLoader.getParent(); - System.out.println(appClassLoader); - System.out.println(extClassLoader); - System.out.println(bootstrapLoader); - - System.out.println(); - System.out.println("bootstrapLoader加载以下文件:"); - URL[] urLs = Launcher.getBootstrapClassPath().getURLs(); - for (URL url : urLs) { - System.out.println(url); - } - - System.out.println(); - System.out.println("extClassLoader加载以下文件:"); - System.out.println(System.getProperty("java.ext.dirs")); - - System.out.println(); - System.out.println("appClassLoader加载以下文件"); - System.out.println(System.getProperty("java.class.path")); - - } -} -``` - -# 双亲委派机制 - -JVM在进行类加载时有个双亲委派机制,当它需要去加载类时,自己先不去加载,而是委托给父加载器加载,父加载器又直接委派它的父加载器,直到找到引导类加载器时,他才会去对类进行加载,这时候如果加载不到,也就是在它所管辖的范围内找不到这个类,就会进行委托的退回,说,啊,我不行,还是你自己来吧,这样一直退回到能加载这个类的时候,才会对类进行加载。 -总结起来就是所有类都会优先使用最顶层的类加载器去加载,从而保证了系统的安全性和类加载的唯一性。 -比如我是一个黑客,在用户的系统里写了一个String类,这个类里面做了一些危害系统的代码,这时候双亲委派机制就能有效的避过这个类,他是应用类加载器要加载String时,会委派给上层,上层在委派给上上层,一直到引导类加载器,引导类加载器会直接使用Java自带的String类。 - -# 全盘负责委托机制 - -“全盘负责”是指当一个ClassLoder装载一个类时,除非显式的使用另外一个ClassLoder,否则该类所依赖及引用的类也由这个ClassLoder载入 - -# 自定义类加载器 - -自定义类加载器只需要继承`java.lang.ClassLoader`类,该类有两个核心方法,一个是`loadClass(String, boolean)`,实现了双亲委派机制,还有一个方法是`findClass`,默认实现是空方法,所以我们自定义类加载器主要是重写`findClass`方法. -打破双亲委派机制主要就是通过重写`loadClass`方法,去掉它的递归委派的代码。 - -测试代码 - -``` -public class MyClassLoaderTest { - static class MyClassLoader extends ClassLoader { - private String classPath; - public MyClassLoader(String classPath) { - this.classPath = classPath; - } - private byte[] loadByte(String name) throws Exception { - name = name.replaceAll("\\.", "/"); - FileInputStream fis = new FileInputStream(classPath + "/" + name + ".class"); - int len = fis.available(); - byte[] data = new byte[len]; - fis.read(data); - fis.close(); - return data; - } - protected Class findClass(String name) throws ClassNotFoundException { - try { - byte[] data = loadByte(name); - // defineClass 将一个字节数组转为 Class 对象, - // 这个字节数组是 class 文件读取后最终的字节数组 - return defineClass(name, data, 0, data.length); - } catch (Exception e) { - e.printStackTrace(); - throw new ClassNotFoundException(); - } - } - //双亲委派机制 - //沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样可以防止核心API库被随意篡改 - //避免类的重复加载:当父亲已经加载了该类时,就没必要子classloader再加载一次,保证被加载类的唯一性。 - //下面通过重写loadClass来打破双亲委派机制 - protected Class loadClass(String name, boolean resolve) - throws ClassNotFoundException { - synchronized (getClassLoadingLock(name)) { - // First, check if the class has already been loaded - Class c = findLoadedClass(name); - if (c == null) { - if (!name.startsWith("com.locaris")) { - c = this.getParent().loadClass(name); - } else { - c = findClass(name); - } - sun.misc.PerfCounter.getFindClasses().increment(); - } - if (resolve) { - resolveClass(c); - } - return c; - } - - } - } - public static void main(String args[]) throws Exception { - // 初始化自定义类加载器,会初始化父类 ClassLoader - // 其中会把自定义类加载器的父类加载器,设置为应用程序类加载器 AppClassLoader - MyClassLoader classLoader = new MyClassLoader("D:/test"); - // D 盘创建 test/com/swordsman/jvm 几级目录,将 User 类的复制类 User1 丢入该目录 - Class clazz = classLoader.loadClass("com.youren.jvm.User"); - Object obj = clazz.newInstance(); - Method method = clazz.getDeclaredMethod("sout", null); - method.invoke(obj, null); - - // 这里因为双亲委派机制的原因, - // 如果 User1 也在 classpath 下,类加载器就是 AppClassLoader - // 只在 D:/test 下就是自定义加载器 - System.out.println(clazz.getClassLoader().getClass().getName()); - } -} -``` diff --git a/source/_posts/other/java程序启动时都发生了什么.md b/source/_posts/other/java程序启动时都发生了什么.md deleted file mode 100644 index 3a7d727..0000000 --- a/source/_posts/other/java程序启动时都发生了什么.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: java程序启动时都发生了什么 -tags: Java技术 -categories: 技术随笔 -abbrlink: 1818557386 -date: 2024-03-06 14:22:05 -keywords: -description: -cover: ---- - -> 本文主要介绍在我们执行java -jar xxx.jar时都发生了什么,附框图。 - -当我们执行这个命令时: -1. java命令会去调用jvm.dll来创建java虚拟机 -2. java虚拟机创建一个引导类加载器,并使用它加载sun.misc.Launcher类 -3. Launcher类创建一些其他的类加载器,比如appclassloader,随后appclassloader会去加载Main.class类。 其中main class是从jar包中的MANIFEST.MF文件找到的。 - - - -加载的过程如下: -1. 首先把类从硬盘加载到jvm内存,具体是在方法区 -2. 然后对类进行验证,主要是验证这个类的字节码是否符合Java的规范,比如某个字节放Java的主版本,次版本,某个字节放类的常量个数等。 -3. 之后进行准备,主要是对类内的静态变量分配内存并赋予默认值. -4. 随后进行解析,把类内部的符号变量替换为一些静态地址. -5. 最后进行初始化,对静态变量赋予初始值。 - - - -> 个人理解: -> 类加载过程就是读取.class文件到内存中,将其放在方法区内,然后在Java堆区创建一个java.lang.Class对象,通过Class对象来访问方法区中类的数据结构。类加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。 diff --git a/source/_posts/other/使用Hexo搭建个人博客.md b/source/_posts/other/使用Hexo搭建个人博客.md index f086025..e44240d 100644 --- a/source/_posts/other/使用Hexo搭建个人博客.md +++ b/source/_posts/other/使用Hexo搭建个人博客.md @@ -93,8 +93,8 @@ default_category: uncategorized category_map: Linux基础: linux 网络基础: network - NAS基础: nasbase - NAS服务: nasservice + NAS技术: nasbase + NAS技术: nasservice 技术随笔: other tag_map: Linux基础: linux diff --git a/source/_posts/other/使用jolcore库查看Java对象大小.md b/source/_posts/other/使用jolcore库查看Java对象大小.md deleted file mode 100644 index 6698081..0000000 --- a/source/_posts/other/使用jolcore库查看Java对象大小.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: 使用jolcore库查看Java对象大小 -tags: Java技术 -categories: 技术随笔 -abbrlink: 155251202 -date: 2024-03-011 14:22:05 -keywords: -description: -cover: ---- - -> 对象大小可以用jolcore包查看,本篇介绍jolcore的基本使用 - - -# 引入依赖 - -``` - - org.openjdk.jol - jol-core - 0.9 - -``` -# 具体使用 -``` -ClassLayout layout = ClassLayout.parseInstance(new Object()); -System.out.println(layout.toPrintable()); -``` - -# 测试代码 -``` -import org.openjdk.jol.info.ClassLayout; -public class JOLSample { - public static void main(String[] args) { - ClassLayout layout = ClassLayout.parseInstance(new Object()); - System.out.println(layout.toPrintable()); - System.out.println(); - ClassLayout layout1 = ClassLayout.parseInstance(new int[]{1,2,3,4,5}); - System.out.println(layout1.toPrintable()); - System.out.println(); - ClassLayout layout2 = ClassLayout.parseInstance(new A()); - System.out.println(layout2.toPrintable()); - } - // -XX:+UseCompressedOops 默认开启的压缩所有指针 - // -XX:+UseCompressedClassPointers 默认开启的只压缩对象头里的类型指针Klass Pointer - // Oops:Ordinary Object Pointers - //堆内存大于32G时,指针压缩会失效。 - //堆内存小于4G时,不需要启用指针压缩,jvm会直接去除高32位地址。 - public static class A { - //8B mark word - //4B Klass Pointer - int id = 6; //4B - String name; //4B - byte b; //1B - Object o; //4B - } -} -``` -# 打印结果 - -``` -java.lang.Object object internals: - OFFSET SIZE TYPE DESCRIPTION VALUE - 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) - 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) - 8 4 (object header) 00 1c 2f c5 (00000000 00011100 00101111 11000101) (-986768384) - 12 4 (object header) 9a 02 00 00 (10011010 00000010 00000000 00000000) (666) -Instance size: 16 bytes -Space losses: 0 bytes internal + 0 bytes external = 0 bytes total - -[I object internals: - OFFSET SIZE TYPE DESCRIPTION VALUE - 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) - 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) - 8 4 (object header) 68 0b 2f c5 (01101000 00001011 00101111 11000101) (-986772632) - 12 4 (object header) 9a 02 00 00 (10011010 00000010 00000000 00000000) (666) - 16 4 (object header) 05 00 00 00 (00000101 00000000 00000000 00000000) (5) - 20 4 (alignment/padding gap) - 24 20 int [I. N/A - 44 4 (loss due to the next object alignment) -Instance size: 48 bytes -Space losses: 4 bytes internal + 4 bytes external = 8 bytes total - -com.locaris.jvm.JOLSample$A object internals: - OFFSET SIZE TYPE DESCRIPTION VALUE - 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) - 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) - 8 4 (object header) 10 f6 9c c5 (00010000 11110110 10011100 11000101) (-979569136) - 12 4 (object header) 9a 02 00 00 (10011010 00000010 00000000 00000000) (666) - 16 4 int A.id 6 - 20 1 byte A.b 0 - 21 3 (alignment/padding gap) - 24 8 java.lang.String A.name null - 32 8 java.lang.Object A.o null -Instance size: 40 bytes -Space losses: 3 bytes internal + 0 bytes external = 3 bytes total -```