
Java
文章平均质量分 58
coldice0521
主要负责网站,软件整体构架
展开
-
Java InputStream未调用close方法进行资源关闭造成直接内存泄漏
今天做一个测试,测试InputStream未关闭资源是否会造成内存泄漏一 测试程序准备未关闭InputStream的Java程序【UrlStreamNoClose.java】:import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.nio.file.Files;import java.nio.file.Paths;public class UrlStreamNoClose.原创 2021-01-17 13:51:19 · 6916 阅读 · 4 评论 -
Java-复用类
复用代码是开发过程中最频繁的行为和需求。一、复用的方式复用代码的方式有三种:继承、组合和继承与组合复用。继承是指在已有类满足部分功能的前提下,还需要一些额外的功能,这时候可以采取拓展现有的能力的基础上,继承父类,在子类的上拓展能力。使用继承的场景和特点如下:继承不是最好的复用方式,增加了类结构管理维护成本,同时耦合性增大。考虑继承的前提是:对象是否有向上转型的需求。继承不建议重写父类方法,有可能产生意想不到的灾难。组合是一种比较优雅的复用方式,组合的思想迫使类模块的实现者严格界定每个类.原创 2021-01-10 11:29:38 · 296 阅读 · 0 评论 -
深入研究JVM垃圾回收器-G1
敬请期待原创 2021-01-03 22:26:35 · 144 阅读 · 0 评论 -
深入理解Java虚拟机-第3章-垃圾收集器
JVM的垃圾收集器经历了多代的发展,从单线程收集器到多线程收集器。一、背景垃圾回收器经历过多代的发展,从单线程到多线程,垃圾收集器的大家族产品如下,每一个连线表示可以组合使用。接下来大概分为几个阶段详细介绍下各个垃圾回收器的特点:阶段收集器名称区域并行/串行/并发算法优缺点适用场景第一阶段Serial新生代串行复制响应速度快单CPU环境下的Client模式Serial Old老年代串行标志-整理响应速度快单CPU环境下的Client.原创 2021-01-03 22:22:11 · 168 阅读 · 0 评论 -
深入理解Java虚拟机-第3章-垃圾收集与内存分配策略
Java与C++之间有一堵由内存动态分配与垃圾回收技术做围成的“高墙”,墙外的人想进去,墙里的人想出去。一、内存分配算法创建对象时,需要分配对象,常用的内存分配方式有两种:指针碰撞和空闲链表法指针碰撞:如果堆内存都是规整的,并且使用的内存都放在一边,空闲的内存都放在一边,中间放着一个指针作为分界点的指示器,那么分配内存仅仅是将指针往空闲的区域挪一下。空闲链表法:针对不连续的内存空间,将空闲的内存空间用链表组织起来,用内存的时候从空闲链表上申请分配内存。使用指针碰撞法的垃圾回收器,Seri.原创 2021-01-03 18:00:11 · 187 阅读 · 0 评论 -
每天学习一个linux命令:jmap命令
jmap是分析Java堆的有效工具,可以查看堆的设置和当前堆各个区域的状态。一、命令格式1.1 jmap -heap命令执行如下命令 打印堆的汇总信息:jmap -heap 进程Id打印的信息如下:Attaching to process ID 119130, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.101-b13using thread-l.原创 2021-01-03 15:07:26 · 1056 阅读 · 3 评论 -
深入理解Java虚拟机-第2章-JVM内存模型
本章主要是学习下JVM的内存模型,在JDK1.8之前存在Perm,在JDK1.8的时候将perm进行拆分,常量池转移到堆空间,Class等元数据放到了metasapce。一、内存结构二、堆原创 2020-12-28 23:53:49 · 169 阅读 · 0 评论 -
深入理解Java虚拟机-第6章-类文件结构
本章从Class文件的结构入手,学习Java虚拟机的一次编译,到处运行的魅力一、前言在虚拟机未出现以前,计算机的世界里只认识0和1,如果程序想要在计算机上运行,首先需要编译成机器的汇编语言,然后计算机根据自身系统的指令集解释成指令编码进行运行。Java虚拟机想做成两件事:平台无关性和语言无关性。平台无关性是指无论在什么平台上,什么指令集上,对上层使用者来说这种差异都是无感知的,由虚拟机去完成不同平台指令集和架构的兼容。使用者只需按照虚拟机规定的文件 格式进行输入要运行的信息。语言无关性是指J.原创 2020-12-27 22:26:33 · 286 阅读 · 0 评论 -
Java-权限访问修饰符
Java 权限访问修饰符public、friendly、protected、private,记录下这几个权限的范围。一、背景补充访问权限是为了管理对象与外部使用者交互的范围,外部使用者能够根据不同的访问权限与所使用的对象进行通信,同时,访问权限能够很好的将内部的逻辑很好的封装控,使得使用者更容易理解使用,同时在重构的过程中也能减少对客户端的感知,重构的时候可以修改对客户端无感知的过程。访问权限是基于包(package)概念上建立起来的,本包、外部包之间的类交互控制是通过访问权限进行控制的。包是一.原创 2020-12-12 21:17:36 · 2314 阅读 · 0 评论 -
Java-初始化与清理
接下来将从几个小节做个学习记录:1、构造器初始化。2、方法重载3、this关键字4、static关键字5、清理6、成员初始化7、数据初始化8、枚举类型一、构造器初始化Java对象有默认构造器,是以类名命名的无参构造器。显示指定构造器后,Java对象默认执定的无参数构造器将不存在。如果需要使用无参构造器,需要指定。初始化对象时,先执行父类构造器和子类构造器。1.1 无参数构造器(默认构造器):public class Constructor { public voi.原创 2020-12-06 21:18:18 · 163 阅读 · 0 评论 -
JVM源码分析:Java对象模型(OOP-Klass模型),Java对象在JVM中的表现形式
jvm环境:openJdk15_20的hotspot一、问题背景当我们在java程序中,使用new创建一个对象时,是否考虑过或者知道这个对象在JVM中是如何表示的?它占用的内存大小是多少?class A { int a;}public static void main(String[] args) { A a = new A();}二、Java对象模型-OOP-Klass在JVM中,Hotspot并没有将Java对象映射成C++对象,而是实现了Java的对象模型(OOP-Klass.原创 2020-09-07 21:30:17 · 943 阅读 · 1 评论 -
JVM调优参数: -Xms -Xmx -Xmn -Xss
简单记录下JVM一些重要的调优参数,防止遗忘。-Xms :设置JVM堆最小内存,此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。例如:-Xms1024m。-Xmx :设置JVM堆最大可用内存,例如:-Xmx1024m-Xmn :设置JVM堆中新生代的内存大小,Sun官方推荐配置为整个堆大小的3/8。-Xss:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生.原创 2020-09-06 20:02:13 · 737 阅读 · 0 评论 -
Spring-test:集成测试中,单元测试上下文相互干扰问题的排查
运行环境:jdk1.8 junit spring-test一、背景最近公司的项目的集成测试遇到一个问题,单元测试方法中,用Mockito.verify对依赖服务进行Mockito.times()调用次数验证时,总是处于不稳定的状态,偶尔会出现不符合预期的情况。验证的情况如下:Mockito.verify(testService, Mockito.times(1)).printHelloWord();这里写两个简单的测试类进行说明:依赖服务类ITestService如下:publ.原创 2020-08-18 14:07:23 · 6444 阅读 · 3 评论 -
《重构 改善既有代码的设计》:6.重新组织代码【6.6分解临时变量】-Split Temporary Valiable(128)
假如现在有这样一段代码:double temp = 2 * (height + weight);System.out.println("周长是" + temp);temp = height * weight;System.out.println("面积是" + temp);看到这段代码,如果不是看汉子注释,是不是很不容易想起来每个公式干嘛的。我们现在就产生想要重构的冲动。将每个变量都声明为“见名知其意”的临时变量,修改后的代码如下:double circumference = 2 * (h原创 2020-07-12 18:34:47 · 176 阅读 · 0 评论 -
《重构 改善既有代码的设计》:6.重新组织代码【6.1提炼函数】-Extract Method(110)
假如现在有一段代码:void printOwing(int count) { System.out.printpn("-------print Title-----"); // print current calcute count System.out.println("---the current calcute count is:" + count) // calculate int countResult = 0; for (int i = 0; i <原创 2020-07-12 15:56:24 · 205 阅读 · 0 评论 -
mac:jdk多版本配置和管理
bogon:openJdk15_20 wanghanbing$ java -versionjava version "14.0.1" 2020-04-14Java(TM) SE Runtime Environment (build 14.0.1+7)Java HotSpot(TM) 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)...原创 2020-05-08 23:15:19 · 694 阅读 · 0 评论 -
OpenJDK的下载和编译过程
文章目录一、背景二、 下载OpenJDK源码三、编译OpenJDK源码四、遇到的问题及解决办法一、背景平台:macOs Sierra 10.12.5BootJDK: Sun jdk14.OpenJDK:jdk-15+20最近看了JVM的原理,特别想知道JVM的底层实现是什么的,只有研究的更深入,才能走的更远,遂决定打开jdk这扇神秘的大门。二、 下载OpenJDK源码open...原创 2020-05-04 13:15:06 · 2143 阅读 · 0 评论 -
Spring:容器与应用的关系
参考:https://blog.youkuaiyun.com/u010013573/article/details/86547687原创 2020-04-25 23:50:15 · 454 阅读 · 0 评论 -
Linux:Java应用随着持续运行一段时间后,内存可用率逐渐减少的乌龙事件排查过程
环境:centos,运行程序: springMVC的web服务容器:jetty一、背景原创 2020-04-21 22:09:49 · 2985 阅读 · 1 评论 -
里氏代换原则概述
https://blog.youkuaiyun.com/fangaoxin/article/details/6717233转载 2020-04-19 15:43:31 · 162 阅读 · 0 评论 -
java jdbc如何使用
JDBC访问一般分为如下流程:1、加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String className)实现。 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ;转载 2016-04-02 22:01:31 · 481 阅读 · 0 评论 -
ubutun或者linux下如何安装jdk1.6
由于自己开发环境需要jdk1.6.所以记录一下jdk1.6的安装过程。这一周感觉很忙,学的东西很多,现在详细整理一下记录下来,防止自己忘记,也希望能够帮助更多的人。一、环境1. ubuntu 14.04 LTS 64位2.jdk 1.6(别的版本也是按照同样的方法安装) 二:下载可以到官网上下载,官网地址http://www.oracle.com/technetwork/java/javase/do原创 2016-07-24 22:52:20 · 1687 阅读 · 0 评论 -
Eclipse创建maven项目的详细过程
作为一个学习java道路上的新手,一切都是新的开始,最近一直想整合一套框架,中间遇到很多问题,现在一步步详细的记录创建maven项目的详细过程的详细过程。一,搭建工具和环境 eclipse:Mars.1 Release (4.5.1) jdk:jdk1.7.0_79(太高版本库中有些接口和方法改变了,无法利 用一些库) Tomcate:apache-tomc原创 2016-06-21 22:45:10 · 10801 阅读 · 0 评论 -
在eclipse中搭建struts2框架的详细过程
今天想学习struts2框架,所以搭建了一个struts框架,记录一下搭建struts2的详细过程。 一:搭建环境: eclipse:Mars.1 Release (4.5.1) jdk:jdk1.7.0_79 Tomcate:apache-tomcat-8.0.32二:下载struts2相关的jar包。 可以从官网下载,下载步骤如下: 1,http://struts.apach原创 2016-06-21 23:27:46 · 25526 阅读 · 9 评论 -
ubuntu或者linux下卸载和安装多个jdk版本,1.6,1.7和1.8版本
今天我教大家在ubuntu下安装多个jdk。我的系统是ubuntu 14.04,64位的。所以我下的的都是适合我的系统的,大家可以根据自己的系统从下面的页面中选择下载适合自己系统的jdk版本。 jdk1.6:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.ht原创 2016-07-31 14:54:07 · 35406 阅读 · 2 评论 -
类的生命周期
在一个类编译完成之后,下一步就需要开始使用类,如果要使用一个类,肯定离不开JVM。在程序执行中JVM通过装载,链接,初始化这3个步骤完成。类的装载是通过类加载器完成的,加载器将.class文件的二进制文件装入JVM的方法区,并且在堆区创建描述这个类的java.lang.Class对象。用来封装数据。 但是同一个类只会被类装载器装载一次。链接就是把二进制数据组装为可以运行的状态。链接分为校验,准备,解转载 2016-09-23 16:49:03 · 306 阅读 · 0 评论 -
JAVA中的反射机制
一,反射的概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。 反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!二,反射机制的作用: 1,反编译:.class–>.java转载 2016-09-23 17:21:30 · 308 阅读 · 0 评论 -
遍历Map的四种方法
转载于这里写链接内容public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("1", "value1"); map.put("2", "value2"); map.put("3", "value3"); //第一种:普遍使用,二转载 2016-10-10 21:38:13 · 313 阅读 · 0 评论 -
java 字符串转成 json 数组并且遍历
当需要把一串字符串转成一个json 数组 ,并遍历其中的内容时。 首页导入 net.sf.json.JSONArray和net.sf.json.JSONObject 两个jar 包String str = "[{name:'a',value:'aa'},{name:'b',value:'bb'},{name:'c',value:'cc'},{name:'d',value:'dd'}]" ; /转载 2016-10-10 21:49:37 · 1863 阅读 · 0 评论 -
eclipse下项目复制和改名
当在Eclipse下复制Web工程时: 1、需要修改复制后新工程源码文件下 .settings 文件夹下的org.eclipse.wst.common.component中的内容为本工程名,明细如图: 2、需要在右击项目,点击Properties,修改Web Project Settings中的名称为复制后的项目名(当然如果你在上面全部换成你的新工程名的话,这一步估计就不用改了),如下图:原创 2016-09-25 21:17:29 · 1204 阅读 · 0 评论 -
js和jsp中遍历list对象
通常,我们需要从后台接收list对象在前台进行遍历,现在有以下几种方法可以使用:方法一:(比较简单,直接使用jstl标签)。首先在头部引入jstl标签:<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>js中和jsp中:<c:forEach items="${results}" var="result">原创 2016-10-11 17:32:42 · 35996 阅读 · 1 评论 -
Spring 事务的配置和使用详解(包括手动对事务的控制部分)
最近项目中用到了spring的注解类的事务管理,所以特地学习和记录一下spring的配置和使用。项目中使用的是springMVC + mybatis + mysql。spring的版本是4.3.0.RELEASE。1. spring 注解事务的配置Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式转载 2017-01-05 20:14:49 · 19462 阅读 · 0 评论 -
JAVA程序员必看的15本书-JAVA自学书籍推荐
作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从。我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水平的Java程序员们。此外,大家可以加入457036818交流群,互相分享一下关于JAVA方面的知识。 一、Java编程入门类 对于没有Java编程经验的程序员要入门,随便读什么入门书籍都一样,转载 2017-01-16 17:45:43 · 2997 阅读 · 0 评论 -
JAVA程序员必看的15本书-JAVA自学书籍推荐
作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从。我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水平的Java程序员们。此外,大家可以加入457036818交流群,互相分享一下关于JAVA方面的知识。 一、Java编程入门类 对于没有Java编程经验的程序员要入门,随便读什么入门书籍都一样,转载 2017-01-16 17:48:41 · 812 阅读 · 0 评论 -
深入分析 Java 中的中文编码问题
http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/ http://www.ibm.com/developerworks/cn/java/j-lo-javaio/ http://www.cnblogs.com/oubo/archive/2012/01/06/2394638.html 编码问题一直困扰着开发人员,尤其在 Jav原创 2017-01-16 20:37:40 · 417 阅读 · 0 评论 -
Log4j 1.x 升级 Log4j 2.x (调研和升级)
因为公司业务需要,目前的log4j 1.x 遇到死锁,需要升级到Log4j 2.x。现在对目前的日志框架进行调研,并根据目前的现状提出升级的方法。一引言 对于一个应用程序来说日志记录是必不可少的一部分。线上问题追踪,基于日志的业务逻辑统计分析等都离不日志。Java领域存在多种框架,目前比较常用的日志框架包括:Log4j、Log4J2、Commons Logging、Slf4j、Logback和J原创 2017-07-03 23:07:19 · 12353 阅读 · 0 评论 -
jar命令成功完成 java -jar 命令却提示“没有主清单属性”!
打好jar包之后还需要更改清单文件的.打开生成的jar,里面有一个MANIFEST.MF的文件把它打开.然后有一行Main-Class,没有就加上。如:Manifest-Version: 1.0Main-Class: 类的全地址 类的全地址前面一定要加上空格,要不然会报错!!!类的全地址一定要写全。例如:包1.包2.class名!!!要在转载 2016-04-02 21:24:20 · 2870 阅读 · 0 评论