为之则易,不为则难
能力说明:
精通JVM运行机制,包括类生命、内存模型、垃圾回收及JVM常见参数;能够熟练使用Runnable接口创建线程和使用ExecutorService并发执行任务、识别潜在的死锁线程问题;能够使用Synchronized关键字和atomic包控制线程的执行顺序,使用并行Fork/Join框架;能过开发使用原始版本函数式接口的代码。
阿里云技能认证
详细说明2020年04月
2020年01月
2019年12月
2019年11月
d
在Java运行时数据区中,将堆分为了新生代和老年代区域,其中新生代又分为Eden,s1,s2区,当需要创建新的对象时在eden区中申请内存,如果申请不到,则触发一次younggc,young gc时将eden区和s1区中的对象全部复制到s2区,然后直接清除eden和s2区。下一次重复上一次操作,当一个对象存活15次以后,将移动到老年区,当老年区满了之后,将会产生Major GC,根据使用的垃圾收集器不同,表现也会不同,大多使用的是标记整理算法。
java是按需加载的,springboot启动的时候,除懒加载外的所有bean都会被注册并实例化到bean容器中,所以当你删除了jar之后,内存中依然存在有原加载并实例化后的对象,所以你可以访问,因为所有的controller都是启动的时候就实例化了的,所以删除jar之后依然可以访问,你可以试试再controller中调用创建某个对象的方法,试试删除之后调用创建方法能不能正确创建对象。
没看明白,看信息像是文件找不到,要把具体配置文件发出来才知道
原因异常信息中已经有了,就是/Users/apple/Desktop/Result这个路径是个构建File是一个目录,不是一个文件,不能使用目录构建FileInputStream对象,要是一个文件才可以
jsp吗?有点忘了jsp了,但是如果没有猜错的话,你引用资源的地方应该用的是相对路径,你可以使用获取根路径,再拼接资源路径
@Autowired获取呢?具体还是看代码才能判断为啥
收藏起来
Vector和ArrayList的底层都是使用数组的方式实现,实现方式相同,插入,删除慢,查询快,不过Vector加了synchronized关键字,所以是线程安全的,ArrayList则是线程不安全的, LinkedList的实现方式的双向链表,插入,删除快,查询慢
Session是将信息保存到服务端,给客户端一个唯一获取session的cookie,请求时将该cookie带到服务端,就能获取到session对象。cookie是保存到客户端的硬盘上的,随请求发送到服务端,所以相对来说cookie是不安全的,容易被破解后获取cookie中的信息
Java种jdk的动态代理的实现原理是动态的生成一个实现了接口的所有方法的一个类,并且该类保留了InvocationHandler的对象的引用,使用Proxy.newInstance()方法获得的其实是生成的类的对象,调用接口方法时即是调用生成对象的方法,但是在生成的类的对象时,由于保留了InvocationHandler的引用,就调用InvocationHandler这个接口的invoke()方法,并将接口的方法和参数传入到invoke()中,这样就实现了动态代理。 cglib则是使用字节码技术,没有实现接口,所以就动态生成一个继承被代理类的对象,然后实现动态代理。
因为需要保证同信的可靠,两次不可以,TCP三次握手可以保证客户端发送的请求服务端能够收到,并且服务端发送的请求Clint端也能保证收到,因为第三次握手是客户端对服务端发送的消息做了回应,这样就保证了本次通信双发都能够收到请求,是可靠的,而两次的话,只能保证客户端发的请求服务端能收到,并不能保证服务端发的请求客户端能够收到,所以需要三次握手建立可靠连接
1.使用原生方式,拆分数组,添加到List List resultList = new ArrayList<>(array.length); for (String s : array) { resultList.add(s); } 2.使用Arrays.asList() List resultList= new ArrayList<>(Arrays.asList(array)); 注意:调用Arrays.asList()时,其返回值类型是ArrayList,但此ArrayList是Array的内部类,调用add()时,会报错:java.lang.UnsupportedOperationException,并且结果会因为array的某个值的改变而改变,故需要再次构造一个新的ArrayList。 3.使用Collections.addAll() List resultList = new ArrayList<>(array.length); Collections.addAll(resultList,array);
从买东西实体店,后来淘宝买,再到现在各种电商平台。 从最开始淘宝支付的时候必须网银支付,到后来的支付宝,再到现在的各种支付平台 从各种单体应用,到后来的分布式架构,再到soa,再到现在的微服务架构 经历了大数据,ai带到生活和技术中的各种角落的变化
spring boot默认就是打的jar文件,打成war:将打包方式改为 war ,移除内置的tomcat容器, org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat 继承org.springframework.boot.web.servlet.support.SpringBootServletInitializer,实现configure方法
spring中bean的加载主要有三步 核心是在AbstractApplicationContext的refresh方法 1,定位:定位到bean资源的位置,如xml,或者其他路径 2,加载:将定位到的的资源进行解析,保存为BeanDefinition对象(保存bean的所有信息) 3,注册:将BeanDefinition对象保存到map容器中 如果没有懒加载的bean,需要进行自动装配,调用getBean()方法创建真实的bean并保存到容器中。同时自动依赖注入
1、PROPERGATION_MANDATORY: 方法必须运行在一个事务中,不存在事务则抛出异常
2、PROPERGATION_NESTED: 存在事务则运行在嵌套事务中,不存在则创建一个事务
3、PROPERGATION_NEVER: 当前方法不能运行在事务中,存在事务则抛出异常
4、PROPERGATION_NOT_SUPPORT: 当前存在事务则将其 挂起
5、PROPERGATION_REQUIRED: 不存在事务则创建一个事务
6、PROPERGATION_REQUIRES_NEW: 新建一个自己的事务,不论当前是否存在事务
7、PROPERGATION_SUPPORT: 存在事务则加入,不存在也可以
${value}的方式是使用预编译的方式对sql进行处理,不会出现sql注入的问题,#{}是直接替换该位置,做字符串拼接,会存在sql注入的问题
ModelAndView