<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Weiwei的学习笔记</title>
    <description>Weiwei的学习笔记</description>
    <link>https://zengweiwei0528.github.io/</link>
    <atom:link href="https://zengweiwei0528.github.io/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Sun, 07 Apr 2019 14:59:47 +0000</pubDate>
    <lastBuildDate>Sun, 07 Apr 2019 14:59:47 +0000</lastBuildDate>
    <generator>Jekyll v3.7.4</generator>
    
      <item>
        <title>&lt;font color='red'&gt;[原创]&lt;/font&gt; JVM内存模型学习笔记</title>
        <description>&lt;ol&gt;
  &lt;li&gt;java内存模型
用于屏蔽各平台的硬件和内存的访问差异，实现各个平台效果一致。&lt;/li&gt;
  &lt;li&gt;主内存和工作内存
	变量都存储在主内存
	工作内存操作变量&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/assets/1.jpg&quot; alt=&quot;工作内存操作变量&quot; title=&quot;工作内存操作变量&quot; /&gt;&lt;/p&gt;

&lt;p&gt;	工作内存与主内存的数据交互&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/8.png&quot; alt=&quot;工作内存与主内存的数据交互&quot; title=&quot;工作内存与主内存的数据交互&quot; /&gt;&lt;/p&gt;

</description>
        <pubDate>Tue, 05 Dec 2017 00:00:00 +0000</pubDate>
        <link>https://zengweiwei0528.github.io/2017/JVM%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
        <guid isPermaLink="true">https://zengweiwei0528.github.io/2017/JVM%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
        
        <category>原创</category>
        
        <category>Java开发</category>
        
        
        <category>原创</category>
        
        <category>Java开发</category>
        
      </item>
    
      <item>
        <title>&lt;font color='red'&gt;[原创]&lt;/font&gt; JVM编译学习笔记</title>
        <description>&lt;ol&gt;
  &lt;li&gt;虚拟机执行字节码
	解释执行
	编译执行（及时编译器）
虚拟机将热点代码编译为与本地机器相关机器码，并进行各层次的优化
	热点代码：运行频繁的代码块（循环体）或者方法
1)	基于采样热点探测：周期性检查各个线程的栈顶
2)	基于计数器
	回边计数器（循环）
	方法调用计数器：给方法设置一个计数器，每次调用则计数值+1，规定时间没有到达阈值，计数减半，成为半衰期
	三个层次优化
1)	第一层：解释器关闭性能检测，发出c1层编译
2)	第二层：编译为本地代码，并进行可靠优化，必要会开启性能检测逻辑
3)	第三层：编译为本地代码，进一步优化，根据性能监控可能发生不可靠的激进优化
	及时编译器优化技术
1)	公共子表达式：表达式已经计算，并且这次的计算值为改变，直接使用之前的计算结果
2)	数组边界消除：确定不会越界的情况下，去除数组边界检查
3)	方法内联：检查调用方法，如果不是一个虚方法，则直接内联，虚方法会检查是否有多个版本可选，如果只有一个，会内联，但是会有一个逃生门，成为守护内联（属于激进优化）
	虚方法：可以被重写的方法
4)	逃逸分析
	方法逃逸：对象在方法内部被定义后，被外部方法引用
	线程逃逸：被外部线程访问
	非逃逸优化
a)	对象放置在栈中
b)	同步消除
c)	标量替换：不创建对象，配置被使用成员变量
	解释器与编译的交互&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;程序开始执行时由解释器执行字节码命令，随着时间的推移，及时编译器也开始工作，将热点代码编译为与本地机器相关的机器码。&lt;/p&gt;

&lt;p&gt;	Javac编译class文件
	解释与符号填充
	插入式注解器处理注解
	分析与class文件生成&lt;/p&gt;

&lt;p&gt;	java中方法调用
（对象.方法名）确定调用的方法
	方法调用字节码指令
1)	Invokestatic：静态方法调用
2)	Invokespecial：构造方法，私有方法，父类方法
3)	Invokevirtual：调用虚方法
4)	Invokeinterface：调用接口&lt;/p&gt;

</description>
        <pubDate>Thu, 12 Oct 2017 00:00:00 +0000</pubDate>
        <link>https://zengweiwei0528.github.io/2017/JVM%E7%BC%96%E8%AF%91%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
        <guid isPermaLink="true">https://zengweiwei0528.github.io/2017/JVM%E7%BC%96%E8%AF%91%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
        
        <category>原创</category>
        
        <category>Java开发</category>
        
        
        <category>原创</category>
        
        <category>Java开发</category>
        
      </item>
    
      <item>
        <title>&lt;font color='red'&gt;[原创]&lt;/font&gt; 类加载器学习笔记</title>
        <description>&lt;p&gt;类加载器&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;classs文件
	class文件是以8位字节为单位的二进制流文件
	魔数：class文件的头4位为魔数，用于确认文件是否能被虚拟机加载
	版本：第5，6位是次版本号；第7，8 位是主版本好
	
1.7版本编译器编译的class文&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;类加载器
	启动类加载器 (BootStrap ClassLoader)
	C++编写
	加载&lt;java_home&gt;/lib文件夹下的核心库
	命名规范（Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类）
	扩展类加载器（Extension ClassLoader）
	加载&lt;java_home&gt;/lib/ext
	系统类加载器（ Application ClassLoader）&lt;/java_home&gt;&lt;/java_home&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;双亲委派模型
加载一个类的时候，会先委托给父类，只有父类无法加载的时候才会自己加载&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;	LoadClass类
由代码可以看出调用loadClass方法时，先去检查系统是否已经加载过该类，如果没有，则先委托给父类。此处先检查有没有父类，没有则使用启动类加载器去加载。（除了启动器类加载器没有父加载器外，其他所有的类都父加载器）。如果父加载器还是没有加载该类，则自己加载该类。这里使用了findClass()&lt;/p&gt;

&lt;p&gt;	findClass
loadClasss(String)方法已经使用了双亲模式的逻辑。用户实现自己的类加载器时，只需重写findClass&lt;/p&gt;

&lt;p&gt;实现findClass需要将class文件以字节数组的方式读入，然后加载进jvm即可。
	defineClass
用于生成对应的clas类对象&lt;/p&gt;

&lt;p&gt;	resolveClass(Class≺?≻ C)
     使用该方法可以使用类的Class对象创建完成也同时被解析&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;从类加载到对象可以被使用的过程&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;	加载
将class文件加载进虚拟机，并生成一个Class对象
	链接
	验证：确保class文件可以被正确加载，不会危害到虚拟机
	准备：为类变量分配初始值（如static int i=5;这里只将i初始化为0，至于5的值将在初始化时赋值）。Final修饰的static变量在编译阶段已经分配
	解析：主要将常量池中的符号引用替换为直接引用的过程
	初始化
类加载最后阶段，若该类具有超类，则对其进行初始化，执行静态初始化器和静态初始化成员变量。
	超类（父类先初始化）-&amp;gt;执行静态初始化器&lt;/p&gt;

</description>
        <pubDate>Tue, 10 Oct 2017 00:00:00 +0000</pubDate>
        <link>https://zengweiwei0528.github.io/2017/%E7%B1%BB%E5%8A%A0%E8%BD%BD%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
        <guid isPermaLink="true">https://zengweiwei0528.github.io/2017/%E7%B1%BB%E5%8A%A0%E8%BD%BD%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
        
        <category>原创</category>
        
        <category>Java开发</category>
        
        
        <category>原创</category>
        
        <category>Java开发</category>
        
      </item>
    
      <item>
        <title>&lt;font color='red'&gt;[原创]&lt;/font&gt; JVM学习笔记</title>
        <description>&lt;ol&gt;
  &lt;li&gt;运行时的数据区域
	程序计数器
线程私有，记录线程的执行虚拟机字节码指令的地址
	Java虚拟机栈
线程私有，方法的调用对应一个栈帧的出入。
	栈帧
1)	操作数栈
2)	局部变量表
3)	动态链接
4)	方法返回地址
	本地方法栈&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;	Java堆&lt;/p&gt;

&lt;p&gt;	方法区
1)	运行时的常量池&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;jvm判断对象“死去”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;	引用计数法
没添加一个引用，计数器+1，失去一个引用，计数器-1.
缺点：无法解决对象相互引用的情况
	可达算法（根搜索）
一个对象到根节点没有引用链，则该对象是不可用的。
	引用链：根节点到某个对象的路径称为该对象的引用链&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/7.png&quot; alt=&quot;引用链&quot; title=&quot;引用链&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;jvm中引用对象的方式
	java虚拟机栈中栈帧中的局部变量表中的变量指向句柄池中的地址。该句柄含有对象在堆中的实例地址和对象类型数据的指针&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;	栈帧中局部变量表的变量直接指向对象，由对象中的一小块地址指向对象类型数据&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;java的四种引用
	强引用
例如代码中 Object a = new Object()类型，只要强引用存在，对象不会被回收
	软引用
软引用对象可以存活到内存溢出之前。
	弱引用
存活到下次GC
	虚引用
无法用虚引用获取对象实例，虚引用为了在对象回收的时候给系统一个通知&lt;/li&gt;
  &lt;li&gt;垃圾回收算法
	标记-清除法
标记需要清楚的对象，然后统一回收对象。
缺点：空间碎片，提前触发GC&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;	复制算法
分区后，将存活的对象拷贝至没被使用的区&lt;/p&gt;

&lt;p&gt;	标记-整理法
标记需要清楚的对象，然后将存活的对象整理至一段，直接清除边界意外的数据&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;分代
	年轻代（minor GC | Yong GC）
年轻代分为Eden ，from，to 三个区域。New一个对象时，会将对象存放在Eden区，每次GC都会将对象拷贝至 from 或to区，直到GC次数达到阈值，对象被放入老年代
	老年代（major GC | full GC）
标记整理法
	永久代&lt;/li&gt;
&lt;/ol&gt;

</description>
        <pubDate>Wed, 14 Jun 2017 00:00:00 +0000</pubDate>
        <link>https://zengweiwei0528.github.io/2017/JVM%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
        <guid isPermaLink="true">https://zengweiwei0528.github.io/2017/JVM%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
        
        <category>原创</category>
        
        <category>Java开发</category>
        
        
        <category>原创</category>
        
        <category>Java开发</category>
        
      </item>
    
      <item>
        <title>&lt;font color='red'&gt;[原创]&lt;/font&gt; Struct项目搭建笔记</title>
        <description>&lt;p&gt;开发工具：intelliJ IDEA&lt;/p&gt;

&lt;p&gt;1．创建一个maven项目&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/1.png&quot; alt=&quot;创建一个maven项目&quot; title=&quot;创建一个maven项目&quot; /&gt;&lt;/p&gt;

&lt;p&gt;配置项目的maven 坐标&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2.png&quot; alt=&quot;配置项目的maven 坐标&quot; title=&quot;配置项目的maven 坐标&quot; /&gt;&lt;/p&gt;

&lt;p&gt;完成后，在项目中添加文件“src/main/java”，“src/main/resources”，“src/test/java”，’“src/test/resources “&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/3.png&quot; alt=&quot;添加文件&quot; title=&quot;添加文件&quot; /&gt;&lt;/p&gt;

&lt;p&gt;添加spring&lt;/p&gt;

&lt;p&gt;添加spring依赖
Pom文件添加依赖，自动下载jar包&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/4.png&quot; alt=&quot;添加spring&quot; title=&quot;添加spring&quot; /&gt;&lt;/p&gt;

&lt;p&gt;配置web.xml文件
		配置&lt;welcome-file-list&gt;标签，定义了我们的主页的位置，输入http：//localhost：8080自动跳至这个标签配置的页面。定义了一个叫做springMVC的DispatcherSevlet，并初始化变量contextConfiguration，代表我们将这个servlet配置内容放置在了spring文件夹下的spring-mvc.xml中了&lt;/welcome-file-list&gt;&lt;/p&gt;

&lt;p&gt;配置spring-mvc.xml内容&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/5.png&quot; alt=&quot;配置spring-mvc.xml内容&quot; title=&quot;配置spring-mvc.xml内容&quot; /&gt;&lt;/p&gt;

&lt;p&gt;编写helloword&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/6.png&quot; alt=&quot;编写helloword&quot; title=&quot;编写helloword&quot; /&gt;&lt;/p&gt;

</description>
        <pubDate>Fri, 21 Apr 2017 00:00:00 +0000</pubDate>
        <link>https://zengweiwei0528.github.io/2017/Struct%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA%E7%AC%94%E8%AE%B0/</link>
        <guid isPermaLink="true">https://zengweiwei0528.github.io/2017/Struct%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA%E7%AC%94%E8%AE%B0/</guid>
        
        <category>原创</category>
        
        <category>Java开发</category>
        
        
        <category>原创</category>
        
        <category>Java开发</category>
        
      </item>
    
  </channel>
</rss>