《深入理解Java虚拟机》笔记

自动内存分配管理机制
  • Java虚拟机栈
    • 这里面存储的是Java方法的内存模型
    • 这里会有两种异常情况
      • StackOverFlowError
      • OutOfMemoryError
  • 本地方法栈
    • 存储的是Native方法服务
    • Native方法根据系统环境的不同而不同
    • 这里也会有这两种异常情况
      • StackOverFlowError
      • OutOfMemoryError
  • Java堆
    • 存放对象实例的空间,几乎所有的对象实例都在这里分配,所以也被称为GC堆。
    • 是java虚拟机管理的最大的一块空间,跟随虚拟机启动而创建。
    • 划分
      • 新生代
      • 老生代
      • 元空间
        • 它分配在物理内存,1.8以前叫“永久代”,永久代在堆内存中分配,功能基本相同
        • 这是为了兼容HotSpot和JRockit诞生的,这两个虚拟机都被Oracle收购,故要兼容
    • 细分

使用mybatis动态查询表名

开发时有个需求,需要对不同的表进行统计条目,然后,在table中分页显示,如果对每个表的统计功能都建立一个mapper,势必会非常繁杂,所以采用动态传入表名的形式会比较方便。
正常情况下,向表名这样的特殊字段是不可以正确执行的,mybatis做了预编译的处理,此时表名是必需的,这是为了防止sql注入的情况。如果我们要动态传递表名,我们可以对mybatis声明为statementType=”STATEMENT”的形式,取消mybatis的预编译,并且,传参时通过${}来接收,这样就可以完成表名的动态传参。
<select id=”countByTbName” statementType=”STATEMENT” resultType=”java.lang.Integer”  parameterType=”java.util.Map” >
        SELECT
            count(*)
        FROM
            ${tbName}
    </select>

 

解决jar包互相依赖导致的错误

最近项目中需要使用阿里巴巴的canal记录mysql的binary log,来监听主数据库的变化,从而备份到从数据库服务器中。但是在一切测试完毕之后,导入到原项目的时候,居然报错,解决了一个上午,终于解决,报错内容如下:
Image
发现,仅仅在向pom.xml文件中添加canal的依赖时,就会包上述的错误,我添加的内容如下:

导出JVM的快照文件,并使用MAT打开分析

最近在学习JVM的工作原理,这是高级工程师必学的知识,书放了好久,现在终于鼓起勇气看完了基础部分。

MAT(Memory Analyzer tool)是分析JVM内存使用情况的工具,可以对线上的项目导出dump快照文件,真实的项目一般都是在Linux服务器上运行,而命令行式的分析难免费劲,这是可以通过导出的dump文件导出后,在可视化的界面进行分析。使用eclipse安装mat的过程可以参考:eclipse安装Eclipse Memory Analyzer插件

下面记录一下,如何使用MAT时怎么使用的,具体的使用过程不太好写,自己也在不断的学习过程中,不敢多说,下面仅记录一下其中的两个过程以备忘:

  • 导出项目的快照dump文件
  • 使用mat打开dump文件
  1. 导入项目的快照dump文件

可以通过两种方式导出dump文件,参数设置方式和命令方式。

参数方式导出

我们可以在项目出现OutOfMemory错误的时候让系统自动执行导出dump文件的过程,这是需要设置两个参数

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\proj.bin

这样在出现内存溢出的时候系统就可以自动导出这个文件,这个文件一般都非常大。

多线程知识整理

  • 使用 isInterrupted()方法判断中断状态
  • 可以在 Thread 对象上调用 isInterrupted()方法来检查任何线程的中断状态。
    这里需要注意:线程一旦被中断,isInterrupted()方法便会返回 true,而一旦 sleep()方法抛出异常,它将清空中断标志,此时isInterrupted()方法将返回 false。
  • 使用 Thread.interrupted()方法判断中断状态

    可以使用 Thread.interrupted()方法来检查当前线程的中断状态(并隐式重置为 false)。又由于它是静态方法,因此不能在特定的线程上使用,而只能报告调用它的线程的中断状态,即判断的都是当前这个线程的状态。

Tomcat启动报404错误、部署报404错误

最近打算在mac上重新安装下Tomcat,没曾想在部署上遇到了问题,以前手懒不记录,后果就是要重新踩一次坑,下面记录一下以备忘。

这类问题比较常见,问题经常出现在,web.xml出错,部署路径不正确的那个

我的这次一下子遇到 2 个问题,还都没有报明显的错误

tomcat启动报404

故障是eclipse安装tomcat,直接启动,报localhost:8080出现404页面。

这个解决方法比较简单,双击tomcat进入设置页面,在server location中选择配置use tomcat location,然后就能正常重启了。

公共方法,将request的各个参数全部转成Map类型

有时经常对request获取的参数进行全部获取,但分别转成 Map 类型也非常麻烦,于是在BaseController里添加了一个公共方法,可以节省一些处理的时间。

获取还会有错,慢慢完善吧….

/**
      * 将用户的请求信息封装成普通的Map
      * @param request
      * @return
      */
      public static Map<String,String> getParameterMap(HttpServletRequest request ) {
         // 参数Map
         Map properties = request.getParameterMap();
         // 返回值Map
         Map<String,String> returnMap = new HashMap<String,String>();
         Iterator entries = properties .entrySet().iterator();
         Map.Entry entry;
         String name = "";
         String value = null;
         while ( entries.hasNext()) {
             entry = (Map.Entry) entries.next();
             name = (String) entry.getKey();
             Object valueObj = entry .getValue();
             if( null == valueObj ){
//               value = null;
             } else if( valueObj instanceof String[]){
                 String[] values = (String[]) valueObj ;
                 for( int i=0; i< values. length; i++){
                     value = values[ i] + ",";
                 }
                 value = value.substring(0, value.length()-1);
             } else{
                 value = valueObj .toString();
             }
             returnMap.put( name, value);
         }
         return returnMap;
     }

调用方法如下:

Map map = BaseController.getParameterMap( request );

 

Exception: java.lang.OutOfMemoryError 错误解决

在JavaEE开发中,经常遇到Exception: java.lang.OutOfMemoryError的错误,这是 tomcat内存溢出导致的,网上的解决办法很多,这里重点记录下eclipse下的解决方法:

在eclipse中,window–>preferences–>Java–>Installed JREs

选中JRE 点击Edit

写入这句话: -Xms800m -Xmx800m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

Reference

http://blog.163.com/jackie_howe/blog/static/199491347201292510130694/