初始化

JVM源码分析之javaagent原理完全解读

帅比萌擦擦* 提交于 2020-03-24 12:22:05
问题描述 当我们一个系统既需要mysql驱动,也需要oracle驱动的时候,在并发加载初始化这些驱动类的过程中产生死锁的可能性非常大,下面是一个模拟的例子,对于Thread2的实现其实是jdk里java.sql.DriverService的逻辑,也是我们第一次调用java.sql.DriverManager.registerDriver注册一个驱动实例要走的逻辑(jdk1.6下),不过这篇文章是使用我们生产环境的一个系统的线程dump和内存dump为基础进行分析展开的。 如果以上代码运行过程中发现有线程一直卡死在Class.forName的调用里,那么说明问题已经重现了。 先上两张图 内存态线程堆栈 线程堆栈 存疑点 仔细看看上面的线程dump分析和内存dump分析里的线程分析模块,您可能会有如下两个疑惑: 【为什么线程[Thread-0]一直卡在Class.forName的位置】:这有点出乎意料,做一个类加载要么找不到抛出ClassNotFoundException,要么找到直接返回,为什么会一直卡在这个位置呢? 【明明[Thread-0]注册的是mysql驱动为什么会去加载Odbc的驱动类】:通过[Thread-0]在栈上看倒数第二帧展开看到传入Class.forName的参数是com.mysql.jdbc.Driver,然后展开栈上顺序第二帧,看到传入的参数是sun.jdbc

设计模式-单例模式(Singleton Pattern)

核能气质少年 提交于 2020-03-24 09:57:44
1、介绍:    单例模式(Singleton Pattern): 所谓单例,就是整个程序有且仅有一个实例。该类负责创建自己的对象,同时确保只有一个对象被创建。 场景: 频繁创建对象、管理对象是一件耗费资源的事,可以使用单例模式。 2、特点 类构造器私有 持有自己类型的属性 对外提供获取实例的静态方法 3、实现方式   编写单例模式的代码其实很简单,就分了三步: 将构造函数私有化(禁止 new 对象) 在类的内部创建实例 提供获取唯一实例的方法 第一种(懒汉,线程不安全): public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 第二种(懒汉,线程安全): public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance

servlet的执行原理与生命周期

依然范特西╮ 提交于 2020-03-24 08:12:15
3 月,跳不动了?>>> 一、先从servlet容器说起:大家最为熟悉的servlet容器就是Tomcat ,Servlet 容器是如何管理 Servlet? 先看一下tomcat的容器模型: 从上图可以看出 Tomcat 的容器分为四个等级,真正管理Servlet 的容器是Context 容器,一个 Context 对应一个 Web 工程 Tomcat 的容器等级中,Context 容器是直接管理 Servlet 在容器中的包装类Wrapper(StandardWrapper)的容器,所以 Context 容器如何运行将直接影响 Servlet 的工作方式。 这里解释一下servlet的包装类:StandardWrapper,这里有个疑问,为什么要将 Servlet 包装成 StandardWrapper 而不直接是 Servlet 对象。因为StandardWrapper 是 Tomcat 容器中的一部分,它具有容器的特征,而 Servlet 为一个独立的 web 开发标准,不应该强耦合在 Tomcat 中。 除了将 Servlet 包装成 StandardWrapper 并作为子容器添加到 Context 中,其它的所有 web.xml 属性都被解析到 Context 中,所以说 Context 容器才是真正运行 Servlet 的 Servlet 容器。一个 Web

Spring ApplicationListener 理解

99封情书 提交于 2020-03-24 07:44:16
在开发时有时候需要在整个应用开始运行时执行一些特定代码,比如初始化环境,准备测试数据、加载一些数据到内存等等。 在 spring 中可以通过ApplicationListener来实现相关的功能,加载完成后触发contextrefreshedevent事件(上下文件刷新事件)。 ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件处理。 如果容器中有一个ApplicationListener Bean,每当ApplicationContext发布ApplicationEvent时,ApplicationListener Bean将自动被触发 。这种事件机制都必须需要程序显示的触发。 其中spring有一些内置的事件,当完成某种操作时会发出某些事件动作。比如监听ContextRefreshedEvent事件,当所有的bean都初始化完成并被成功装载后会触发该事件,实现ApplicationListener<ContextRefreshedEvent>接口可以收到监听动作,然后可以写自己的逻辑。 同样事件可以自定义、监听也可以自定义,完全根据自己的业务逻辑来处理。 内置事件 序号         Spring 内置事件 & 描述 1    

Servlet 技术全总结 (已完成,不定期增加内容)

假装没事ソ 提交于 2020-03-24 07:33:03
Servlet 技术全总结 (已完成,不定期增加内容) https://www.cnblogs.com/jokerjason/p/5751677.html Servlet是独立于平台和协议的服务器端的java应用程序,处理请求的信息并将其发送到客户端。 Servlet的客户端可以提出请求并动态获得响应。 Servlet动态生成web页面,担当浏览器或其他客户端发出的请求与HTTP服务器上的数据库或应用程序之间的中间层。 对于所有客户端请求,都只需要创建一次Servlet实例,因此,节省了大量内存。 Part 1 Servlet运行原理 web服务器收到一个http请求后,判断请求内容,若是静态页面数据,自行处理,若为动态数据,交给Servlet容器,Servlet容器找到相应Servlet实例处理;处理结果交给web服务器,再转交给客户端。 针对同一个Servlet,Servlet容器会在第一次收到HTTP请求时建立一个Servlet实例,然后启动一个线程,第二次收到http请求后,Servlet容器无需创建相同Servlet ,仅开启第二个线程来处理请求。 ----->多线程的方式有效提高执行效率,降低服务器负担。 Part 2 Servlet 优势 Servlet具有优良的跨平台性; 可移植性良好:java语言编写,Servlet API标准完善

pyquery 的用法 --爬虫解析库

此生再无相见时 提交于 2020-03-24 07:03:53
如果你对 Web 有所涉及,如果你比较喜欢用 CSS 选择器,如果你对 jQuery 有所了解,那么这里有一个更适合你的解析库 ——pyquery 。 接下来,我们就来感受一下 pyquery 的强大之处。 1. 准备工作 在开始之前,请确保已经正确安装好了 pyquery 。若没有安装 pip install pyquery 。 2. 初始化 像 Beautiful Soup 一样,初始化 pyquery 的时候,也需要传入 HTML 文本来初始化一个 PyQuery 对象。它的初始化方式有多种,比如直接传入字符串,传入 URL ,传入文件名,等等。下面我们来详细介绍一下。 字符串初始化 首先,我们用一个实例来感受一下: html = ''' <div> <ul> <li class="item-0">first item</li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li> <li class="item-1 active"><a href="link4.html">fourth item</a></li> <li

使用 Vagrant 打造跨平台开发环境

我们两清 提交于 2020-03-24 02:34:39
Vagrant 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史。 我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。 安装步骤 1. 安装 VirtualBox 虚拟机还是得依靠 VirtualBox 来搭建,免费小巧。 下载地址: https://www.virtualbox.org/wiki/Downloads * 虽然 Vagrant 也支持 VMware,不过 VMware 是收费的,对应的 Vagrant 版本也是收费的 2. 安装 Vagrant 下载地址: http://downloads.vagrantup.com/ 根据提示一步步安装。 此外,还得下载官方封装好的基础镜像: Ubuntu precise 32 VirtualBox http://files.vagrantup.com/precise32.box Ubuntu precise 64 VirtualBox http://files.vagrantup.com/precise64.box 如果你要其他系统的镜像,可以来这里下载: http:

类加载:加载、验证、准备、解析、初始化、使用、卸载

我是研究僧i 提交于 2020-03-23 22:17:47
3 月,跳不动了?>>> 加载:1. 通过完全限定名加载 .class 字节码文件,获取字节流。2. 实例化对应的 Class 实例 验证:验证字节流是否符合虚拟机规范,文件格式等 准备:为类变量分配内存并设置初始值。存储在方法区中 解析:将符号引用转为直接引用 初始化:执行JAVA代码进行初始化。执行先初始化父类,再初始化子类。先初始化静态,再初始化非静态的。先执行初始化块,再执行构造方法。 类加载需要锁。是因为避免多个线程同时访问资源,导致结果不正确 JAVA如何判断一个类相等?完全限定名相同且都是同一个类加载器加载得到的 Class 实例。 因此,类加载需要 双亲委派模型 。子加载器需要先让父加载器加载,如果没有再执行自身的加载。这样能保证一个类产生一个 Class 对象,避免混乱 从JDK1.8之后的版本 PlatformClassLoader 取代了原来的 ExtClassLoader 。主要是因为之前直接在 lib\ext 目录添加jar包不够安全。 public class Main { public static void main(String[] args) throws Exception { ClassLoader loader = Main.class.getClassLoader(); while (loader != null) { System

Verilog读取HEX文件初始化ROM

女生的网名这么多〃 提交于 2020-03-23 20:48:26
ROM.v代码 这个模块设计的关键是在复位信号中执行初始化代码,读取指定位置的HEX文件中的数据初始化rom,然后在其他时钟沿时刻输出地址所指的数据。 // read hex file to initial ROM or RAM module ROM ( input clk , input rst_n , input [15:0] addr , output reg [7:0] q ); parameter filename = "F:/project/cpu/code/ModelSim/04_ROMInitTest/src/ROM.hex" ; reg [ 7:0] char_1st ; reg [15:0] address ; // Rom address reg [ 7:0] len ; // bytes of one line in the hex file reg [ 7:0] dat ; reg [7:0] sum ; // intel hex file verification reg [640:1] errstr ; reg [7:0] rom [0:4095]; reg CanRead ; integer i , fp , code ; always @( posedge clk ) if (! rst_n ) begin char_1st = 0;