
java
文章平均质量分 78
你是我的天晴
wx:lexang
展开
-
jvm,深入理解java虚拟机,内存分配与回收策略
Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。关于回收内存这一点,我们已经使用了大量篇幅去介绍虚拟机中的垃圾收集器体系以及运作原理,现在我们再一起来探讨一下给对象分配内存的那点事儿。对象的内存分配,往大方向讲,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配[1]),对象主要分配在新生代的Eden区上,如...原创 2022-01-22 16:23:43 · 413 阅读 · 0 评论 -
jvm,深入理解java虚拟机,垃圾收集算法与垃圾收集器
垃圾收集算法由于垃圾收集算法的实现涉及大量的程序细节,而且各个平台的虚拟机操作内存的方法又各不相同,因此本节不打算过多地讨论算法的实现,只是介绍几种算法的思想及其发展过程。标记-清除算法最基础的收集算法是“标记-清除”(Mark-Sweep)算法,如同它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,它的标记过程其实在前一节讲述对...原创 2022-01-20 09:13:43 · 327 阅读 · 0 评论 -
jvm,深入理解java虚拟机,对象已死吗
在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(即不可能再被任何途径使用的对象)。引用计数算法很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。作者面试过很多的应届生和...原创 2022-01-18 11:11:37 · 148 阅读 · 0 评论 -
jvm,深入理解java虚拟机,实战:OutOfMemoryError异常
在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下文称OOM)异常的可能,本节将通过若干实例来验证异常发生的场景(代码清单2-3~代码清单2-9的几段简单代码),并且会初步介绍几个与内存相关的最基本的虚拟机参数。本节内容的目的有两个:第一,通过代码验证Java虚拟机规范中描述的各个运行时区域存储的内容;第二,希望读者在工作中遇...原创 2022-01-17 19:18:20 · 677 阅读 · 0 评论 -
Java虚拟机垃圾收集器分析 基本回收算法 垃圾回收器
java虚拟机垃圾收集器分析1 、活动对象追踪 root 对象算法: 深度追踪 root 对象,将 heap 中所有被引用到的 root做标志,所有未被标志的对象视为非活动对象,所占用的空间视为非活动内存。2 、常用算法Copy 算法 1 方法:将内存分为两个区域( from space 和 to space )。所有的对象分配内存都分配到 from space 。在清理非活动对象阶段,把所有标志为活动的对象, copy 到 to space ,之后清楚 from space 空间。然原创 2022-01-16 10:40:30 · 155 阅读 · 0 评论 -
jvm,深入理解java虚拟机,HotSpot虚拟机对象探秘
对象的创建Java是一门面向对象的编程语言,在Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象(例如克隆、反序列化)通常仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢?虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代...原创 2022-01-16 10:39:35 · 300 阅读 · 0 评论 -
java程序的151个建议-提倡异常封装,采用异常链传递异常
Java语言的异常处理机制可以确保程序的健壮性,提高系统的可用率,但是Java API提 供的异常都是比较低级的(这里的低级是指“低级别”的异常),只有开发人员才能看得懂, 才明白发生了什么问题。而对于终端用户来说,这些异常基本上就是天书,与业务无关,是纯计算机语言的描述,那该怎么办?这就需要我们对异常进行封装了。异常封装有三方面的 优点:(1) 提髙系统的友好性例如,打开一个文件,如原创 2022-01-14 17:23:42 · 183 阅读 · 0 评论 -
不同的列表选择不同的遍历方法
我们来思考这样一个案例:统计一个省的各科髙考平均值,比如数学平均分是多少,语文平均分是多少等,这是每年招生办都会公布的数据,我们来想想看该算法应如何实现。当 然使用数据库中的一个SQL语句就能求出平均值,不过这不再我们的考虑之列,这里还是使用纯;lava的算法来解决之,看代码:public static void main(String[]args) {//学生数量,80万int st原创 2022-01-14 16:36:33 · 153 阅读 · 0 评论 -
springmvc(springboot)前后端传参数组
@RequestMapping(value = "/deleteByIds", method = RequestMethod.POST) public JzBaseResponse deleteByIds(List<Integer> ids) { menuService.deleteByIds(null); return JzBaseResponse.setOk("删除成功"); } @RequestMapping(value =...原创 2020-06-16 10:58:59 · 2601 阅读 · 0 评论 -
request对象inputstream输入流的多次读取
在我们希望从拦截器或过滤器里获取请求Request中的输入流解析里面的内容时,然而当在次获取时,比如在业务里面想在获取时就获取不到了。InputStream只能被读取一次,在InputStream读取的时候,会有一个pos指针,它指示每次读取之后下一次要读取的起始位置。在每次读取后会更新pos的值,当你下次再来读取的时候是从pos的位置开始的,而不是从头开始,所以第二次获取String中的值的时候...原创 2020-01-07 11:29:34 · 2724 阅读 · 0 评论 -
二进制是怎样做位运算的
二进制是怎样做位运算的程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说白了,就是直接对整数在内存中的二进制位进行操作。大部分运算流程都是先将整数转换为二进制,然后进行相应二进制操作。常见的操作有如下几种:1、按位与 and两个二进制数进行按位与操作:相同位的两个数字都为1,则为1;若有一个不为1,则为0。例如:00101 & 11100 = 00100转载 2016-06-07 22:22:32 · 2778 阅读 · 0 评论 -
spring拿到WebApplicationContext,获取bean
创建listenerServletContextListener获取WebApplicationContext,创建WebContext setcontext getBeanpublic class StartListener implements ServletContextListener { public void contextInitialized(ServletCont原创 2016-08-17 14:44:48 · 3339 阅读 · 0 评论 -
struts2中拦截器与过滤器的区别
struts拦截器拦截只能action ,拦截器需要在struts配置文件进行配置。拦截器配置文件:拦截器类实现:如何自定义一个拦截器?自定义一个拦截器需要三步:1自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。2在strutx.xml中注册上一步中定义的拦截器。3在需要使用的Action原创 2016-01-15 00:20:25 · 434 阅读 · 0 评论 -
Java中Filter、Listener,拦截器的学习,listener、 filter、servlet 加载顺序及其详解
Filterfilter可认为是Servlet的一种“变种”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。它与Servlet的区别在于:它不能直接向用户生成响应。完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。Filter有如下几个用原创 2016-08-17 16:18:26 · 6846 阅读 · 0 评论 -
java类数据的初始化顺序
public class StaticInitialization { public static void main(String[] args) { System.out.println("Creating new Cupboard() in main"); new Cupboard(); System.out.println("Creating new Cupb...原创 2015-05-18 20:57:27 · 863 阅读 · 1 评论 -
centons7安装jdk8
安装说明系统环境:centos7安装方式:rpm安装软件:jdk-8u25-linux-x64.rpm下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html检验系统原版本[root@zck ~]# java -versionjava version "1.7.0_"原创 2016-08-30 12:47:18 · 1202 阅读 · 0 评论 -
从Eclipse转 Intellij Idea 需要做的设置 快捷键设置
有时候希望使用自动补全,因为不偷懒的程序员不是好程序员。但是Idea的默认快捷键是 Ctrl + 空格。 对于安装中文输入法的普通人来说那就是杯具了,你懂的。修改方法如下:点击 文件菜单(File) –> 点击 设置(Settings… Ctrl+Alt+S), –> 打开设置对话框。在左侧的导航框中点击 KeyMap。 接着在右边的树型框中选择 Main menu –&...原创 2017-09-21 15:06:15 · 1147 阅读 · 0 评论 -
XML中DTD,XSD的区别与应用
XML我们并不陌生,在企业级应用中有很广的用途。具体就不再说,下面介绍一下DTD,XSD的区别并以XSD为例看spring中定义与使用。1.DTD(Documnet Type Definition)DTD即文档类型定义,是一种XML约束模式语言,是XML文件的验证机制,属于XML文件组成的一部分。DTD 是一种保证XML文档格式正确的有效方法,可以通过比较XML文档和DTD文件来看文档是否符合规范原创 2018-01-19 15:46:20 · 674 阅读 · 0 评论 -
linux下配置java环境变量(详细)
1 下载,根据 Linux系统的位数选择,这里以后缀为.tar.gz的为例,.rpm的直接安装就是。2 解压。3 把解压后的文件夹放到/usr/local 下面。(这个随便,任意目录下都可以)4 在主目录下找到隐藏文件.profile , 若没有.profile,则去找文件 .bash_profile (注意文件名以点号开头,因为是隐藏文件)。5 在文件.profile 或 .b...原创 2015-05-18 20:57:30 · 8685 阅读 · 1 评论 -
优先选择基本类型
包装类型是一个类,它提供了诸如构造方法、类型转换、比较等非常实用的功能,而且在Java 5之后又实现了与基本类型之间的自动转换,这使包装类型如虎添翼,更是应用广泛了,在开发中包装类型已经随处可见,但无论是从安全性、性能方面来说,还是从稳定性方面来说,基本类型都是首选方案。我们来看一段代码:public class Client { public static void main(S转载 2015-10-18 20:59:31 · 460 阅读 · 0 评论 -
SimpleDateFormat线程不安全及解决办法
昨天知道了findbugs这个工具 而且用这个工具找到了潜在几个问题,有一个是便利map用的keyset findbugs建议改成entrtyset,还有一个就是 SimpleDateFormat不是线程安全的:As the JavaDoc states, DateFormats are inherently unsafe for multithreaded use. The detecto转载 2016-09-30 11:09:25 · 2558 阅读 · 0 评论 -
java内存模型,JVM参数调优技巧,GC故障解决
一、JVM内存区域模型是啥样?这个是JVM大致的内存分布模型,看起来比较直观: 1.方法区: 也称”永久代” 、“非堆”, 它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。可以说方法区就是公共存放常量等静态的常量池。 运行时常量池:是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,转载 2017-08-30 14:38:46 · 1051 阅读 · 0 评论 -
spring集成 JedisCluster 连接 redis3.0 集群
maven依赖: redis.clients jedis 2.8.02.增加spring 配置 property name="clusterList" value="172.16.23.27:6379,172.16.23.原创 2017-06-29 15:45:13 · 1244 阅读 · 0 评论 -
理解java的三大特性之封装
三大特性之---封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节(当然转载 2015-12-03 01:23:20 · 407 阅读 · 0 评论 -
mysql 创建表不能使用“事务”回滚
需求:由于当初设计,往“项目表”中添加一条数据,就分别要创建“样本表”和“结果表”。 我当初的想法就是希望上面一连串的动作就是一个事物,如果只要是出现了异常,结果就是插入数据库不成功,并且创建数据库失败,但是测试了两天,使用了spring事务的很多种方式,还是不行,但是只要不创建数据库就没有任何问题,因此怀疑就是创建表实际上是不支持事务的。 那么上面的需求怎么解决呢?解决办法:原创 2015-10-14 23:36:24 · 5595 阅读 · 0 评论 -
不要在本类中覆盖静态导入的变量和方法
如果一个类中的方法及属性与静态导入的方法及属性重名会出现什么问题呢?我们先来看一个正常的静态导入,代码如下:import static java.lang.Math.PI; import static java.lang.Math.abs; public class Client { public static void main(String[] args) {转载 2015-10-11 22:28:54 · 685 阅读 · 0 评论 -
java程序的151个建议-警惕自增的陷阱
public class Client { public static void main(String[] args) { int count =0; for(int i=0;i原创 2015-10-11 22:11:14 · 520 阅读 · 0 评论 -
动态代理可以使代理模式更加灵活
Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成 代理,避免重复开发。我们知道一个静态代理是通过代理主题角色(Proxy)和具体主题角 色(Real Subject)共同实现抽象主题角色(Subject)的逻辑的,只是代理主题角色把相关的 执行逻辑委托给了具体主题角色而已,一个简单的静态代理如下所示://抽象主题角色interface Subje原创 2015-11-06 11:01:38 · 336 阅读 · 0 评论 -
构造函数尽量简化
我们知道在通过new关键字生成对象时必然会调用构造函数,构造函数的简繁情况会直接影响实例对象的创建是否繁琐。在项目开发中,我们一般都会制订构造函数尽量简单,尽可能不抛异常,尽量不做复杂算法等规范,那如果一个构造函数确实复杂了会怎么样?我们来看一段代码:publicclassClient{ publicstaticvoidmain(String[]args){原创 2022-01-14 16:23:48 · 232 阅读 · 0 评论 -
用偶判断,不用奇判断
判断一个数是奇数还是偶数是小学里学的基本知识,能够被2整除的整数是偶数,不能被2整除的是奇数,这规则简单又明了,还有什么好考虑的?好,我们来看一个例子,代码如下:public class Client { public static void main(String[] args) { //接收键盘输入参数 Scanner input转载 2015-10-18 16:44:13 · 514 阅读 · 0 评论 -
提防包装类型的null值
我们知道Java引入包装类型(Wrapper Types)是为了解决基本类型的实例化问题,以便让一个基本类型也能参与到面向对象的编程世界中。而在Java 5中泛型更是对基本类型说了“不”,如想把一个整型放到List中,就必须使用Integer包装类型。我们来看一段代码://计算list中所有元素之和 public static int f(ListInteger> list){转载 2015-10-18 19:04:19 · 496 阅读 · 0 评论 -
边界,边界,还是边界
某商家生产的电子产品非常畅销,需要提前30天预订才能抢到手,同时它还规定了一个会员可拥有的最多产品数量,目的是防止囤积压货肆意加价。会员的预定过程是这样的:先登录官方网站,选择产品型号,然后设置需要预订的数量,提交,符合规则即提示下单成功,不符合规则提示下单失败。后台的处理逻辑模拟如下:public class Client { //一个会员拥有产品的最多数量 publ转载 2015-10-18 18:21:47 · 561 阅读 · 0 评论 -
mysql中采用concat来拼接中文字符乱码解决方式
mysql concat乱码问题解决 concat(str1,str2)当concat结果集出现乱码时,大都是由于连接的字段类型不同导致,如concat中的字段参数一个是varchar类型,一个是int类型或doule类型,就会出现乱码。解决方法:利用mysql的字符串转换函数CONVERT将参数格式化为char类型就可以了。举例: concat('数量:',CONVERT(int...原创 2015-09-15 18:22:09 · 3600 阅读 · 0 评论 -
mybatis中的#和$的区别
#相当于对数据 加上 双引号,$相当于直接显示数据 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 2. $将传入的数据直接显示生成在sql中。如:order by转载 2016-01-13 15:23:02 · 272 阅读 · 0 评论 -
匿名内部类是否可以继承其它类?是否可以实现接口? 代码讲解
匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口实例1:不使用匿名内部类来实现抽象方法abstract class Person { public abstract void eat();} class Child extends Person转载 2016-01-13 16:12:14 · 12815 阅读 · 0 评论 -
几个 Context 上下文的区别
在 java 中, 常见的 Context 有很多, 像: ServletContext, ActionContext, ServletActionContext, ApplicationContext, PageContext, ... 那么, Context 究竟是什么东西呢? 直译是上下文、环境的意思。比如像: "今天我收到了一束花, 男朋友送的!" 又或者 "今天我收到了原创 2017-06-29 12:13:14 · 535 阅读 · 0 评论 -
Maven打包不打test,Maven中-DskipTests和-Dmaven.test.skip=true的区别
在使用mvn package进行编译、打包时,Maven会执行src/test/java中的JUnit测试用例,有时为了跳过测试,会使用参数-DskipTests和-Dmaven.test.skip=true,这两个参数的主要区别是:-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。-Dmav转载 2017-03-06 10:52:20 · 8030 阅读 · 1 评论 -
spring事务详解
之前一直对事务懂得模棱两可,今天专门写了个类,进行测试求证,下面为类代码及说明:spring事务配置: -->原创 2017-03-06 11:05:26 · 488 阅读 · 0 评论 -
ArrayBlockingQueue与LinkedBlockingQueue的使用及区别
BlockingQueue接口定义了一种阻塞的FIFO queue,每一个BlockingQueue都有一个容量,让容量满时往BlockingQueue中添加数据时会造成阻塞,当容量为空时取元素操作会阻塞。 ArrayBlockingQueue是一个由数组支持的有界阻塞队列。在读写操作上都需要锁住整个容器,因此吞吐量与一般的实现是相似的,适合于实现“生产者消费者”模式。 基于链表的转载 2017-04-05 16:11:14 · 2246 阅读 · 0 评论 -
java 利用spring JavaMailSenderImpl发送邮件,支持普通文本、附件、html
1.引入pom javax.mail mail 1.4.4 org.springframework spring-context-support 4.2.4.RELEASE 2,config.prope原创 2017-04-05 17:48:13 · 2628 阅读 · 0 评论