zoukankan      html  css  js  c++  java
  • 远离java 6个功能

    1.Reflection 反射

    Spring和Hibernate等流行的库,用到反射。《但是业务代码坏在很多原因》

    建议措施:

    首先是代码可读性/工具支持。打开你最喜欢的IDE和在Java代码中找到相互依赖关系。很容易,不是吗?现在,将方法调用替换为反射并试图重复这个过程。事情更加失控,当你开始修改的状态通常应该封装。如果你需要一个例子,看看下面的代码:

    public class Secret {
        
        @SuppressWarnings("unused")
        private String secrety;
    
        public Secret(String secrety) {
            super();
            this.secrety = secrety;
        }
    
        public String getSecrety() {
            return null;
        }
    }
    public class TestSecrecy {
        public static void main(String[] args) throws Exception {
            Secret s = new Secret("TOP SECRET");
            Field field = Secret.class.getDeclaredField("secrety");
            
            //设置可以访问private成员
            field.setAccessible(true);
            System.out.println(field.get(s));
        }
    }

    getDeclaredField()参数是在运行时才发现 ,错过编译时的安全性(检查);发现运行错误是很多时候比你的构建脚本错误更加棘手,困难

    最后,反射将会有开销,它的调用是由JIT优化。一些优化需要更长的时间来申请,有的甚至不能应用。所以反射的性能损失,有时是数量级。

    但在一个典型的业务应用程序,你会没有注意到开销,这绝对是一个只是两害相权取其轻。

    总而言之,我可以理解,唯一合理的(间接)反映在你业务代码是通过使用AOP。除此之外,你最好远离反射。

     

    2.字节码操作

    如果使用CGLIB或ASM直接您的Java EE应用程序代码中,会使事情变得很糟糕

    你没有可执行代码在编译时的一个地方。从本质上讲,你不知道什么代码实际上是运行在您的生产。所以当面对麻烦你扔进运行时故障诊断和调试。

    3.Threadlocal

    有两个不相关的原因看到threadlocal在业务代码让我很不友好。

    首先,threadlocal的帮助下,你可以开始感到诱惑没有显式地使用变量传递下来通过方法调用链。这可能是有用的在某些场合。

    但是当你不小心的时候,我可以保证你将会创建很多意想不到的依赖在你的代码。

    第二个原因是我日常工作相关。在threadlocal存储数据构建高速highway内存泄漏。

    至少有一个出了10 PermGen的渗漏是由大量的ThreadLocal的使用造成的。

    在与类加载器和线程池相结合,“java.lang.OutOfMemoryError:Permgen space”是指日可待。

    4.类加载器(Classloaders)

    首先,类加载器是一个复杂的。你必须先了解他们,层次结构,代表团力学,类缓存,等等。而且,即使你认为你已经得到它,第一个(10?),企图将仍然无法正常工作。在最低限度,你最终将建立一个类加载器泄漏。所以,我只能建议保留此任务的应用程序服务器。

    5.弱引用和软引用(Weak and Soft References)

     可以查看这里:http://www.cnblogs.com/pjcdarker/p/4820512.html

    在软引用构建缓存可能是如何委派一些复杂性的GC,而不是自己实现它自己一个很好的例子。

    以一个任意的缓存为例。你建立它使用软引用的值,因此当内存耗尽GC可以介入并开始清理。但是现在你没有控制哪些对象被从缓存中删除,而且更有可能将它们重新创建的下一个高速缓存(因为不知道那些对象可以删除 ,缺失的对象可能会重新创建)。如果内存仍然是稀缺引发GC再次清理。恶性循环形成和应用程序成为CPU绑定的完整GC不断运行

    6.套接字(Sockets)

    java.net.Socket有点扯淡了。由于阻塞性质。

    当编写一个典型的Java EE应用程序使用一个基于web的前端需要高度的并发支持大量用户。

    你现在不希望发生的事情是线程池坐在那里等待阻塞套接字。

     注:不太理解,还得努力学习;翻译也太烂了

  • 相关阅读:
    自己写的一些公共js方法
    node(03)--利用 HTTP 模块 URl 模块 PATH 模块 FS 模块创建一个 WEB 服务器
    node(03 fs文件模块)
    node (02 CommonJs 和 Nodejs 中自定义模块)顺便讲讲module.exports和exports的区别 dependencies 与 devDependencies 之间的区别
    node.js (01http 模块 url 模块)
    Ubuntu 16.04 下python2和python3及对应的pip的方法
    MySQL划重点-查询-聚合
    MySQL划重点-查询-条件
    MySQL命令
    使用Navicat for Mysql连接装在虚拟机Ubuntu16.04上的mysql服务器
  • 原文地址:https://www.cnblogs.com/pjcdarker/p/4833987.html
Copyright © 2011-2022 走看看