java 大神求助关于java静态函数知识,有关内存

2016 Java工程师笔试题(内存泄漏问题)
o &nbsp,&nbsp&nbsp,&nbsp
下面哪种情况会导致持久区jvm堆内存溢出()
循环上万次的字符串处理
在一段代码内申请上百M甚至上G的内存
使用CGLib技术直接操作字节码运行,生成大量的动态类
不断创建对象
1,2,3,4都会
关于伯乐小组
这里有好的话题,有启发的回复和值得信任的圈子。
新浪微博:
推荐微信号
(加好友请注明来意)
- 好的话题、有启发的回复、值得信赖的圈子
- 分享和发现有价值的内容与观点
- 为IT单身男女服务的征婚传播平台
- 优秀的工具资源导航
- 翻译传播优秀的外文文章
- 国内外的精选博客文章
- UI,网页,交互和用户体验
- 专注iOS技术分享
- 专注Android技术分享
- JavaScript, HTML5, CSS
- 专注Java技术分享
- 专注Python技术分享
& 2018 伯乐在线java项目内存溢出解决方法
内存容易溢出可以说是因为在程序中有内存泄漏(memory leak)的问题,容易引起内存溢出的直接原因可以归结为代码质量问题,在内存中存在大量的对象,垃圾回收器不能回收,随着程序的不断运行,程序会创造更多的对象,这些对象之间存在一定的内联关系,所以不容易造成被java垃圾回收器回收。
解决的办法:第一对所有的代码包括页面中的java代码都进行一遍彻底的回顾检查,1.对那些静态(static)的对象要特别留神,特别是类型为Map,List,Set的,静态的变量会一直驻存在内存中,生命周期比较长,不会被垃圾器回收。2.对于代码,要审查是否生成了大量的冗余的对象,还有一些逻辑业务处理的类,算法是否过于复杂,调整算法,对于代码认真审查,再仔细重构一遍代码,能提高代码质量,提高程序运行稳定性。 3.Java中的内存溢出大都是因为栈中的变量太多了。其实内存有的是。建议不用的尽量设成null以便回收,多用局部变量,少用成员变量。 1),变量所包含的对象体积较大,占用内存较多。2),变量所包含的对象生命周期较长。3),变量所包含的对象数据稳定。4),该类的对象实例有对该变量所包含的对象的共享需求。4.在我的程序中对静态变量的优化后,使程序占用内存量至少提升了5k-10k。所以也不容忽视。第二还有就是String类相关的东西:1.字符串累加的时候一定要用StringBuffer的append方法,不要使用+操作符连接两个字符串。差别很大。而且在循环或某些重复执行的动作中不要去创建String对象,因为String对象是要用StringBuffer对象来处理的,一个String对象应该是产生了 3个对象(大概是这样:))。2.字符串length()方法来取得字符串长度的时候不要把length放到循环中,可以在循环外面对其取值。(包括vector的size方法)。特别是循环次数多的时候,尽量把length放到循环外面。int size = xmlVector.size();
for (int i = 2; i & i++) {
}写代码的时候处理内存溢出
(outofmemoryerror
e){//可以用一个共通函数来执行.
system.out.print
system.gc();
4.对于频繁申请内存和释放内存的操作,还是自己控制一下比较好,但是System.gc()的方法不一定适用,最好使用finallize强制执行或者写自己的finallize方法。Java 中并不保证每次调用该方法就一定能够启动垃圾收集,它只不过会向JVM发出这样一个申请,到底是否真正执行垃圾收集,一切都是个未知数。
Tomcat&Java内存溢出的处理http://blog.sina.com.cn 日09:29 晓光标签:
11月1日以tomcat环境为例,其它WEB服务器如jboss,weblogic等是同一个道理。一、java.lang.OutOfMemoryError: PermGen space PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法:
手动设置MaxPermSize大小修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE:
$CATALINA_BASE"”上面加入以下行:JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128M"
将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。二、java.lang.OutOfMemoryError: Java heap space
Heap size 设置JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。解决方法:手动设置Heap size修改TOMCAT_HOME/bin/catalina.sh在“echo "Using CATALINA_BASE:
$CATALINA_BASE"”上面加入以下行:JAVA_OPTS="-server -Xms800m -Xmx800m
-XX:MaxNewSize=256m"三、实例,以下给出1G内存环境下java jvm 的参数设置参考:JAVA_OPTS="-server -Xms800m -Xmx800m
-XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,轻微时,会使系统性能急剧下降,严重时,将导致系统无法运行,影响系统的稳定性。当内存不够用时,常见的问题就是报tomcat内存益处错误,从儿导致客户端包500错误的,如下:解决方法主要是加大TOMCAT可利用内存,并在程序当中加大内存使用。因此根据应用的需求,有必要调整JVM使用内存的大小。现在将手工修改tomcat内存的方法及注意事项列出,希望能对新人有所帮助。
tomcat提供了两种安装模式,即免安装(*.zip)和安装(*.exe)方式。针对不同的安装方式下修改tomcat内存大小的方法几注意问题(windows环境):
方式1:当选择安装方式时,可以在安装tomcat的过程进行设置tomcat初始化内存的大小。但是假如说在安装时没有选择,或者应用改变了,需要增加tomcat内存时怎么半呢?此时,我们就要手工修改tomcat的一些文件了。
看了很多网上的资料,都是说修改<CATALINA_HOME>bincatalina.bat文件的内容,即在里面增加一行代码:
set JAVA_OPTS=-Xms512m -Xmx512m //表示初始化最小可用内存和最大可用内存都是512MB(修改相应值即可)
如在catalina.bat的
rem ----- Execute The Requested Command
echo Using CATALINA_BASE: %CATALINA_BASE%
echo Using CATALINA_HOME: %CATALINA_HOME%
echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%
echo Using JAVA_HOME: %JAVA_HOME%
这一栏改为
rem ----- Execute The Requested Command
set JAVA_OPTS=-Xms512m -Xmx512m
echo Using CATALINA_BASE: %CATALINA_BASE%
echo Using CATALINA_HOME: %CATALINA_HOME%
echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%
echo Using JAVA_HOME: %JAVA_HOME%
就可以将JAVA虚拟机分配内存 508.0625MB的!
但是很多人修改后,发现修改并没有起作用,即通过windows的服务启动tomcat时,实际的内存还是默认的,修改的设置并没有起作用;而通过<CATALINA_HOME>binstartup.bat 启动却是生效的。这是为什么呢?因为在安装过程中,JVM的初始化参数已经写在注册表中了,由于没有修改注册表中相关参数,所以以windows服务方式启动时,修改的并没有生效。而通过<CATALINA_HOME>binstartup.bat 启动直接是通过<CATALINA_HOME>bincatalina.bat文件中的配置的。你需要重新加载到系统服务中才生效,或者你手工在注册表中查找修改启动值,加载到服务中的时候参数已经配置好了,自己修改artup.bat不会改变注册表中的参数设置。
解决方法:修改注册表中的参数,加入JVM初始化内存的参数:
HKEY_LOCAL_MACHINESOFTWAREApache Software FoundationTomcat Service ManagerTomcat5ParametersJavaOptions
-Dcatalina.home="C:ApacheGroupTomcat 5.0"
-Djava.endorsed.dirs="C:ApacheGroupTomcat 5.0commonendorsed"
如加入 -Xms512m -Xmx800m
方式2:针对免安装的用户,也可以通过将tomcat注册为windows的一个服务的方式来实现:我们可以对service.bat文件做一些其他修改,使tomcat更加能满足我们各种不同需求时的要求
1. 如果让tomcat编译jsp文件,就在PR_CLASSPATH中加入J2SDK的tools.jar
set PR_CLASSPATH=%CATALINA_HOME%binbootstrap.jar
set PR_CLASSPATH=%JAVA_HOME%libtools. %CATALINA_HOME%binbootstrap.jar
2.要使用一个特定的JVM,就要修改jvm的参数;要使注册的windows服务的启动方式为自动,增加--Startup Automatic,这个是比较常用的;要用定制的server.xml配置文件并且传递多个参数给StartClass,要修改StartParams的值,各个值之间用分号分隔:
"%EXECUTABLE%" //IS//%SERVICE_NAME% --Jvm auto
--StartClass org.apache.catalina.startup.Bootstrap --StopClass org.apache.catalina.startup.Bootstrap
--StartParams start --StopParams stop
"%EXECUTABLE%" //IS//%SERVICE_NAME% --Jvm "%JAVA_HOME%jrebinserverjvm.dll"
--StartClass org.apache.catalina.startup.Bootstrap --StopClass org.apache.catalina.startup.Bootstrap
--StartParams "- %CUSTOM_SERVERXML_FILE%; - start" --StopParams stop
--Startup Automatic
3. 指定最大和最小的内存限制,要增加jvm的初始参数
"%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions
"-Dcatalina.base=%CATALINA_BASE%; -Dcatalina.home=%CATALINA_HOME%; -Djava.endorsed.dirs=%CATALINA_HOME%commonendorsed"
--StartMode jvm --StopMode jvm
"%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions
"-Xms128M; -Xmx256M; -Dcatalina.base=%CATALINA_BASE%; -Dcatalina.home=%CATALINA_HOME%; -Djava.endorsed.dirs=%CATALINA_HOME%commonendorsed"
--StartMode jvm --StopMode jvm
4.有时注册windows服务成功后,但是启动服务时显示“发生服务特定错误: 0.”就是因为jvm没有指定,修改Jvm auto为Jvm "%JAVA_HOME%jrebinserverjvm.dll"后重新注册windows服务就可以启动了。 posted on 20
java--程序运行时出现内存溢出
Java内存溢出详解及解决方案
MyEclipse中项目运行,提示Java内存溢出
Java基础恶补——内存泄露、内存溢出
关于Eclipse运行java程序时内存溢出
J2EE项目内存溢出解决办法总结
java中三种常见内存溢出错误的处理方法
常见Java内存溢出与解决方法详解
没有更多推荐了,内存大家都知道(当然不是硬盘啊)。与c、c++相比呢,Java在内存管理的方面一个优越之处就是我们不用显式的去对对象进行内存的分配和内存的回收,可能有人会着迷于对内存使用分配的这种快感,但是随着程序变大,对于内存的维护工作也就越来越大。Java的JVM的自动内存管理机制,凸显出了强大的优越感。。。。
但反而是因为这样的一个现状,就弱化了我们在写Java程序时遇到内存溢出等问题时的定位能力和解决问题的能力。就在这个时候一本书应运而生--- 《深入理解java虚拟机》 这本书也算是我旁边落灰最严重的一本了,但写程序就是这样如果不沉到底,程序浮于表面那就只是单纯的应用,不能变的熟练。
只有我们真正的了解了JVM如何管理内存后,才能遇见OutOfMemory错误时,快速的根据异常日志信息定位和解决问题。
Java内存分配方式
咱们看看上面这张图,颜色这么鲜艳,这次一定能记住了!
静态 存储区
内存在程序编译的时候就已经分配好了,这块内存在程序的整个运行期间都存在。比如,static 、全局变量
在 栈 上创建
在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分匹配运算内置于处理器的指令集中、效率很高、但是分配的内存容量非常有限。
在 堆 上分配
动态内存分配。在c和c++中运行程序时用 malloc 或 new申请任意大小的内存,我们需要自己决定自己在何时何地使用使用free和delete来释放内存。
Java虚拟机内存模型是Java程序运行的基础。虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干的不同的数据区域,ok,这里加重 是分为不同的数据区域,这些区域都有自己的用途以及创建和销毁的时间。看一下下图,
太好了,又画了一个带颜色的图~那就说一说为什么带不同的颜色吧
紫色,由所有线程共享的数据区
线程隔离的数据区
程序计数器
寄存器里面有一个叫指令寄存器,用来储存现在正在被运行的指令。想象一下,在JVM中怎么办,程序寄存器就是这样的功能。
程序技术器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。“字节码”就是Java程序被编译之后的形态,JVM有字节码解释器,这个解释器要解释程序的哪段,就由这个程序技术器来决定的。
Java虚拟机栈
Java虚拟机栈也是线程私有的,生命周期与线程相同,虚拟机栈描述的是Java方法执行的内存模型。每个方法在执行的同时会创建栈帧,保存
局部变量表
每个方法从调用直到执行完成的过程,就对应整一个栈帧在虚拟机栈中入栈和出栈的过程。
平时咱们在讨论的时候总会提到“栈”和“堆”这两种内存区域,那么其中的栈,就是这里所指的栈,更细一点说,就是虚拟机栈中局部变量的部分。
在换一个方面讲解一下,虚拟机栈是用来被快速访问的存储区域,一般该区域位于通用RAM里,
这个RAM叫随机存储器,是与CPU直接交换数据的内存存储器,也叫主存,可以随时随地的写,而且速度快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。
在虚拟机栈中,使用栈指针来访问处理器。我们都学过栈这种数据结构,它是一种快速有效的 分配 存储的方法,存储速度仅次于寄存器,堆栈指针若向下移动,则分配新的内存,若向上移动则释放那些内存。由于Java编译器需要预先去生成相应的内存空间,所以,当我们尝试创建程序的时候,Java编译器必须知道被存储在站内的所有数据的确切大小和声明周期。一遍可以像上面描述的那样去分配内存空间。
栈相对于堆的优势就是比堆存取快,在栈中重要被用来存放一下基本类型的变量,例如int、short、long、byte、float、double、boolean、char,以及对象的引用(对象本身一般都存放在堆中)
StackOverFlow和OutOfMemoryError
Java虚拟机规范允许Java栈的大小是动态的或者是固定不变的。如果线程在计算过程中,请求的栈深度大于最大可用的栈深度,则在程序运行过程中会抛出StackOverFlow异常、如果Java栈可以动态扩展,而在扩展的过程中没有足够的内存空间支持栈的发展,在运行过程中会抛出OutOfMemoryError异常。
本地方法栈
本地方法栈与虚拟机栈所发挥的作用十分相似,区别就是虚拟机栈执行Java(字节码)的方法,本地栈是为虚拟机使用到Native方法。
Java堆(Heap)是Java虚拟机所管理的内存中最大的一块。堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。次内存却与的唯一目的就是存放对象示例,刚才在栈的部分也说了,栈中存的是对象的索引,而对象的实例存放在堆中。
在Java虚拟机规范中描述:所有的对象实例以及数组都要被在堆上分配内存。
GC(Garbage Collection)垃圾回收
由于堆和栈结构上的不同,所以其内存回收的机制也是不一样的。
Java中对可以细分为:
From Survivor空间
To Survivor
在内存的角度来看,线程共享的Java堆中可能划分出多个线程私有的分配缓存区(Thread Local Allocation Buffer,TLAB)。Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像我们的磁盘空间一样,在实现是,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的
在堆中没有内存完成实例分配,并且堆也无法在扩展时会抛出OutOfMemoryError异常。
方法区和Java堆是一样的,是各个线程共享的内存区域,他用于储存已被虚拟机加载的类的信息、常量、静态变量、即时编译器编译后的代码等数据。
阅读(...) 评论()数组的初始化静态初始化及内存图
下一节课程: 数组操作的两个常见小问题越界和空指针
(224次播放)
5 秒后自动播放下一节
章节
笔记
提问
JAVA 初级入门视频教程
第1章 JAVA 计算机基础
第2章 JAVA 语言基础(一)
第3章 JAVA 语言基础(二)
第4章 JAVA 语言基础(三)
第5章 JAVA 语言基础(四)
第6章 JAVA 语言基础(五)
第7章 JAVA 面向对象(一)
第8章 JAVA 面向对象(二)
第9章 JAVA 面向对象(三)
第10章 JAVA 面向对象(四)
第11章 JAVA 开发工具
第12章 JAVA 常见对象(一)
第13章 JAVA 常见对象(二)
第14章 JAVA 常见对象(三)
第15章 JAVA 集合框架(一)
第16章 JAVA 集合框架(二)
第17章 JAVA 集合框架(三)
第18章 JAVA 集合框架(四)
第19章 JAVA
IO流(一)
第20章 JAVA IO流(二)
第21章 JAVA IO流(三)
第22章 JAVA IO流(四)
第23章 JAVA 多线程(一)
第24章 JAVA 多线程(二)
第25章 JAVA 设计模式
第26章 JAVA GUI
第27章 JAVA 网络编程
第28章 JAVA 反射
第29章 JAVA JDK5新特性
看过该课程的同学也在学Java大神修炼之路
一、基础篇
  1.1 JVM
  1.1.1. 内存模型,Java内存管理,Java堆和栈,垃圾回收
  http://www.jcp.org/en/jsr/detail?id=133
  http://ifeve.com/jmm-faq/
  1.1.2. 了解JVM各种参数及调优
  1.1.3. 学习使用Java工具
jps, jstack, jmap, jconsole, jinfo, jhat, javap, …
http://kenai.com/projects/btrace
http://www.crashub.org/
https://github.com/taobao/TProfiler
https://github.com/CSUG/HouseMD
http://wiki.cyclopsgroup.org/jmxterm
https://github.com/jlusdy/TBJMap
  1.1.4. 学习Java诊断工具
  http://www.eclipse.org/mat/
  http://visualvm.java.net/oqlhelp.html
  1.1.5. 自己编写各种outofmemory,stackoverflow程序
  HeapOutOfMemory
  Young OutOfMemory
  MethodArea OutOfMemory
  ConstantPool OutOfMemory
  DirectMemory OutOfMemory
  Stack OutOfMemory
  Stack OverFlow
  1.1.6. 使用工具尝试解决以下问题,并写下总结
  当一个Java程序响应很慢时如何查找问题
  当一个Java程序频繁FullGC时如何解决问题,如何查看垃圾回收日志
  当一个Java应用发生OutOfMemory时该如何解决,年轻代、年老代、永久代解决办法不同,导致原因也不同
  1.1.7. 参考资料
  http://docs.oracle.com/javase/specs/jvms/se7/html/
  http://www.cs.umd.edu/~pugh/java/memoryModel/
  http://gee.cs.oswego.edu/dl/jmm/cookbook.html
  1.2. Java基础知识
  1.2.1. 阅读源代码
  java.lang.String
  java.lang.Integer
  java.lang.Long
  java.lang.Enum
  java.math.BigDecimal
  java.lang.ThreadLocal
  java.lang.ClassLoader & java.net.URLClassLoader
  java.util.ArrayList & java.util.LinkedList
  java.util.HashMap & java.util.LinkedHashMap & java.util.TreeMap
  java.util.HashSet & java.util.LinkedHashSet & java.util.TreeSet
  1.2.2. 熟悉Java中各种变量类型
  1.2.3. 熟悉Java String的使用,熟悉String的各种函数
  1.2.4. 熟悉Java中各种关键字
  1.2.5. 学会使用List,Map,Stack,Queue,Set
  上述数据结构的遍历
  上述数据结构的使用场景
  Java实现对Array/List排序
  java.uti.Arrays.sort()
  java.util.Collections.sort()
  Java实现对List去重
  Java实现对List去重,并且需要保留数据原始的出现顺序
  Java实现最近最少使用cache,用LinkedHashMap
  1.2.6. Java IO&Java NIO,并学会使用
  java.io.*
  java.nio.*
  nio和reactor设计模式
  文件编码,字符集
  1.2.7. Java反射与javassist
  反射与工厂模式
  java.lang.reflect.*
  1.2.8. Java序列化
  java.io. Serializable
  什么是序列化,为什么序列化
  序列化与单例模式
  google序列化protobuf
  1.2.9. 虚引用,弱引用,软引用
  java.lang.ref.*
  实验这些引用的回收
  1.2.10. 熟悉Java系统属性
  java.util.Properties
  1.2.11. 熟悉Annotation用法
  java.lang.annotation.*
  1.2.12. JMS
  javax.jms.*
  1.2.13. JMX
  java.lang.management.*
  javax.management.*
  1.2.14. 泛型和继承,泛型和擦除
  1.2.15. 自动拆箱装箱与字节码
  1.2.16. 实现Callback
  1.2.17. java.lang.Void类使用
  1.2.18. Java Agent,premain函数
  java.lang.instrument
  1.2.19. 单元测试
  Junit,http://junit.org/
  Jmockit,https://code.google.com/p/jmockit/
  djUnit,http://works.dgic.co.jp/djunit/
  1.2.20. Java实现通过正则表达式提取一段文本中的电子邮件,并将@替换为#输出
  java.lang.util.regex.*
  1.2.21. 学习使用常用的Java工具库
  commons.lang, commons.*…
  guava-libraries
  1.2.22. 什么是API&SPI
  http://en.wikipedia.org/wiki/Application_programming_interface
  http://en.wikipedia.org/wiki/Service_provider_interface
  1.2.23. 参考资料
  JDK src.zip 源代码
  http://openjdk.java.net/
  http://commons.apache.org/
  https://code.google.com/p/guava-libraries/
  http://netty.io/
  http://stackoverflow.com/questions/2954372/difference-between-spi-and-api
  http://stackoverflow.com/questions//how-to-implement-the-api-spi-pattern-in-java
  1.3. Java并发编程
  1.3.1. 阅读源代码,并学会使用
  java.lang.Thread
  java.lang.Runnable
  java.util.concurrent.Callable
  java.util.concurrent.locks.ReentrantLock
  java.util.concurrent.locks.ReentrantReadWriteLock
  java.util.concurrent.atomic.Atomic*
  java.util.concurrent.Semaphore
  java.util.concurrent.CountDownLatch
  java.util.concurrent.CyclicBarrier
  java.util.concurrent.ConcurrentHashMap
  java.util.concurrent.Executors
  1.3.2. 学习使用线程池,自己设计线程池需要注意什么
  1.3.3. 锁
  什么是锁,锁的种类有哪些,每种锁有什么特点,适用场景是什么
  在并发编程中锁的意义是什么
  1.3.4. synchronized的作用是什么,synchronized和lock
  1.3.5. sleep和wait
  1.3.6. wait和notify
  1.3.7. 写一个死锁的程序
  1.3.8. 什么是守护线程,守护线程和非守护线程的区别以及用法
  1.3.9. volatile关键字的理解
   volatile关键字和Java volatile关键字
  happens-before语义
  编译器指令重排和CPU指令重排
  http://en.wikipedia.org/wiki/Memory_ordering
  http://en.wikipedia.org/wiki/Volatile_variable
  http://preshing.com//the-happens-before-relation/
  1.3.10. 以下代码是不是线程安全?为什么?如果为count加上volatile修饰是否能够做到线程安全?你觉得该怎么做是线程安全的?
public class Sample {
private static int count = 0;
public static void increment() {
  1.3.11. 解释一下下面两段代码的差别
public class Sample {
private static int count = 0;
synchronized public static void increment() {
public class Sample {
private static AtomicInteger count = new AtomicInteger(0);
public static void increment() {
count.getAndIncrement();
  1.3.12. 参考资料
  http://book.douban.com/subject//
  http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
  二、 进阶篇
  2.1. Java底层知识
  2.1.1. 学习了解字节码、class文件格式
  http://en.wikipedia.org/wiki/Java_class_file
  http://en.wikipedia.org/wiki/Java_bytecode
  http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
  http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/
  http://asm.ow2.org/
  2.1.2. 写一个程序要求实现javap的功能(手工完成,不借助ASM等工具)
  如Java源代码:
public static void main(String[] args) {
int i = 0;
System.out.println(i);
  编译后读取class文件输出以下代码:
public static void main(java.lang.String[]);
Stack=2, Locals=2, Args_size=1
invokevirtual
LineNumberTable:
line 8: 16
  2.1.3. CPU缓存,L1,L2,L3和伪共享
  http://duartes.org/gustavo/blog/post/intel-cpu-caches/
  http://mechanical-sympathy.blogspot.com/2011/07/false-sharing.html
  2.1.4. 什么是尾递归
  2.1.5. 熟悉位运算
  用位运算实现加、减、乘、除、取余
  2.1.6. 参考资料
  http://book.douban.com/subject/1138768/
  http://book.douban.com/subject/6522893/
  http://en.wikipedia.org/wiki/Java_class_file
  http://en.wikipedia.org/wiki/Java_bytecode
  http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
  2.2. 设计模式
  2.2.1. 实现AOP
  CGLIB和InvocationHandler的区别
  http://cglib.sourceforge.net/
  动态代理模式
  Javassist实现AOP
  http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/
  ASM实现AOP
  http://asm.ow2.org/
  2.2.2. 使用模板方法设计模式和策略设计模式实现IOC
  2.2.3. 不用synchronized和lock,实现线程安全的单例模式
  2.2.4. nio和reactor设计模式
  2.2.5. 参考资料
  http://asm.ow2.org/
  http://cglib.sourceforge.net/
  http://www.javassist.org/
  2.3. 网络编程知识
  2.3.1. Java RMI,Socket,HttpClient
  2.3.2. 用Java写一个简单的静态文件的HTTP服务器
  实现客户端缓存功能,支持返回304
  实现可并发下载一个文件
  使用线程池处理客户端请求
  使用nio处理客户端请求
  支持简单的rewrite规则
  上述功能在实现的时候需要满足“开闭原则”
  2.3.3. 了解nginx和apache服务器的特性并搭建一个对应的服务器
  http://nginx.org/
  http://httpd.apache.org/
  2.3.4. 用Java实现FTP、SMTP协议
  2.3.5. 什么是CDN?如果实现?DNS起到什么作用?
  搭建一个DNS服务器
  搭建一个 Squid 或 Apache Traffic Server 服务器
  http://www.squid-cache.org/
  http://trafficserver.apache.org/
  http://en.wikipedia.org/wiki/Domain_Name_System
  2.3.6. 参考资料
  http://www.ietf.org/rfc/rfc2616.txt
  http://tools.ietf.org/rfc/rfc5321.txt
  http://en.wikipedia.org/wiki/Open/closed_principle
  2.4. 框架知识
  spring,spring mvc,阅读主要源码
  ibatis,阅读主要源码
  用spring和ibatis搭建java server
  2.5. 应用服务器知识
  熟悉使用jboss,https://www.jboss.org/overview/
  熟悉使用tomcat,http://tomcat.apache.org/
  熟悉使用jetty,http://www.eclipse.org/jetty/
  三、 高级篇
  3.1. 编译原理知识
  3.1.1. 用Java实现以下表达式解析并返回结果(语法和Oracle中的select sysdate-1 from dual类似)
sysdate - 1
sysdate - 1/24
sysdate - 1/(12*2)
  3.1.2. 实现对一个List通过DSL筛选
QList&Map&String, Object&& mapList = new QList&Map&String, Object&&;
mapList.add({"name": "hatter test"});
mapList.add({"id": -1,"name": "hatter test"});
mapList.add({"id": 0, "name": "hatter test"});
mapList.add({"id": 1, "name": "test test"});
mapList.add({"id": 2, "name": "hatter test"});
mapList.add({"id": 3, "name": "test hatter"});
mapList.query("id is not null and id & 0 and name like '%hatter%'");
  要求返回列表中匹配的对象,即最后两个对象;
  3.1.3. 用Java实现以下程序(语法和变量作用域处理都和JavaScript类似):
  代码:
var a = 1;
var b = 2;
var c = function() {
var a = 3;
println(a);
println(b);
println(a);
println(b);
  输出:
  3 2 1 2
  3.1.4. 参考资料
  http://en.wikipedia.org/wiki/Abstract_syntax_tree
  https://javacc.java.net/
  http://www.antlr.org/
  3.2. 操作系统知识
  Ubuntu
  Centos
  使用linux,熟悉shell脚本
  3.3. 数据存储知识
  3.3.1. 关系型数据库
  如何看执行计划
  如何搭建MySQL主备
  binlog是什么
  Derby,H2,PostgreSQL
  SQLite
  3.3.2. NoSQL
  Memcached
  Leveldb
  Bigtable
  Cassandra
  Mongodb
  图数据库
  3.3.3. 参考资料
  http://db-engines.com/en/ranking
  http://redis.io/
  https://code.google.com/p/leveldb/
  http://hbase.apache.org/
  http://cassandra.apache.org/
  http://www.mongodb.org/
  http://www.neo4j.org/
  3.4. 大数据知识
  3.4.1. Zookeeper,在linux上部署zk
  3.4.2. Solr,Lucene,ElasticSearch
  在linux上部署solr,solrcloud,,新增、删除、查询索引
  3.4.3. Storm,流式计算,了解Spark,S4
  在linux上部署storm,用zookeeper做协调,运行storm hello world,local和remote模式运行调试storm topology。
  3.4.4. Hadoop,离线计算
  Hdfs:部署NameNode,SecondaryNameNode,DataNode,上传文件、打开文件、更改文件、删除文件
  MapReduce:部署JobTracker,TaskTracker,编写mr job
  Hive:部署hive,书写hive sql,得到结果
  Presto:类hive,不过比hive快,非常值得学习
  3.4.5. 分布式日志收集flume,kafka,logstash
  3.4.6. 数据挖掘,mahout
  3.4.7. 参考资料
  http://zookeeper.apache.org/
  https://lucene.apache.org/solr/
  https://github.com/nathanmarz/storm/wiki
  http://hadoop.apache.org/
  http://prestodb.io/
  http://flume.apache.org/,http://logstash.net/,http://kafka.apache.org/
  http://mahout.apache.org/
  3.5. 网络安全知识
  3.5.1. 什么是DES、AES
  3.5.2. 什么是RSA、DSA
  3.5.3. 什么是MD5,SHA1
  3.5.4. 什么是SSL、TLS,为什么HTTPS相对比较安全
  3.5.5. 什么是中间人攻击、如果避免中间人攻击
  3.5.6. 什么是DOS、DDOS、CC攻击
  3.5.7. 什么是CSRF攻击
  3.5.8. 什么是CSS攻击
  3.5.9. 什么是SQL注入攻击
  3.5.10. 什么是Hash碰撞拒绝服务攻击
  3.5.11. 了解并学习下面几种增强安全的技术
  http://www.openauthentication.org/
  HOTP http://www.ietf.org/rfc/rfc4226.txt
  TOTP http://tools.ietf.org/rfc/rfc6238.txt
  OCRA http://tools.ietf.org/rfc/rfc6287.txt
  http://en.wikipedia.org/wiki/Salt_(cryptography)
  3.5.12. 用openssl签一个证书部署到apache或nginx
  3.5.13. 参考资料
  http://en.wikipedia.org/wiki/Cryptographic_hash_function
  http://en.wikipedia.org/wiki/Block_cipher
  http://en.wikipedia.org/wiki/Public-key_cryptography
  http://en.wikipedia.org/wiki/Transport_Layer_Security
  http://www.openssl.org/
  https://code.google.com/p/google-authenticator/
  四、 扩展篇
  4.1. 相关知识
  4.1.1. 云计算,分布式,高可用,可扩展
  4.1.2. 虚拟化
  https://linuxcontainers.org/
  http://www.linux-kvm.org/page/Main_Page
  http://www.xenproject.org/
  https://www.docker.io/
  4.1.3. 监控
  http://www.nagios.org/
  http://ganglia.info/
  4.1.4. 负载均衡
  http://www.linuxvirtualserver.org/
  4.1.5. 学习使用git
  https://github.com/
  https://git.oschina.net/
  4.1.6. 学习使用maven
  http://maven.apache.org/
  4.1.7. 学习使用gradle
  http://www.gradle.org/
  4.1.8. 学习一个小语种语言
  Groovy
  LISP, Common LISP, Schema, Clojure
  4.1.9. 尝试了解编码的本质
  了解以下概念
  ASCII, ISO-8859-1
  GB2312, GBK, GB18030
  Unicode, UTF-8
  不使用 String.getBytes() 等其他工具类/函数完成下面功能
public static void main(String[] args) throws IOException {
String str = "Hello, 我们是中国人。";
byte[] utf8Bytes = toUTF8Bytes(str);
FileOutputStream fos = new FileOutputStream("f.txt");
fos.write(utf8Bytes);
fos.close();
public static byte[] toUTF8Bytes(String str) {
return null;
  想一下上面的程序能不能写一个转GBK的?
  写个程序自动判断一个文件是哪种编码
  4.1.10. 尝试了解时间的本质
  时区 & 冬令时、夏令时
  http://en.wikipedia.org/wiki/Time_zone
  ftp://ftp.iana.org/tz/data/asia
  http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%9C%8B%E6%99%82%E5%8D%80
  http://en.wikipedia.org/wiki/Leap_year
  ftp://ftp.iana.org/tz/data/leapseconds
  System.currentTimeMillis() 返回的时间是什么
  4.1.11. 参考资料
  http://git-scm.com/
  http://en.wikipedia.org/wiki/UTF-8
  http://www.iana.org/time-zones
  4.2. 扩展学习
  4.2.1. JavaScript知识
  4.2.1.1. 什么是PROTOTYPE
  修改代码,使程序输出“1 3 5”:
  http://jsfiddle.net/Ts7Fk/
  4.2.1.2. 什么是闭包
  看一下这段代码,并解释一下为什么按Button1时没有alert出“This is button: 1”,如何修改:
  http://jsfiddle.net/FDPj3/1/
  4.2.1.3. 了解并学习一个JS框架
  jQuery
  ArgularJS
  4.2.1.4. 写一个GREASEMONKEY插件
  http://en.wikipedia.org/wiki/Greasemonkey
  4.2.1.5. 学习NODE.JS
  http://nodejs.org/
  4.2.2. 学习html5
  ArgularJS,https://docs.angularjs.org/api
  4.2.3. 参考资料
  http://www.ecmascript.org/
  http://jsfiddle.net/
  http://jsbin.com/
  http://runjs.cn/
  http://userscripts.org/
  五、 推荐书籍
  《深入Java虚拟机》
  《深入理解Java虚拟机》
  《Effective Java》
  《七周七语言》
  《七周七数据》
  《Hadoop技术内幕》
  《Hbase In Action》
  《Mahout In Action》
  《这就是搜索引擎》
  《Solr In Action》
  《深入分析Java Web技术内幕》
  《大型网站技术架构》
  《高性能MySQL》
  《算法导论》
  《计算机程序设计艺术》
  《代码大全》
  《JavaScript权威指南》
转载地址:
某阿里大神想和java程序员说的话
2017年——10年JAVA大神告诉你最常用的20%技术有哪些?
推荐一个大神的博客--chenssy
java大神潜在的十个特征
曾经的黑帮老大,现在的Java大神,你有什么要问的?
怎么成为java大神?
【推荐】Java工程师如何从普通成为大神值得一读
如何成为一个牛掰的Java大神
java从菜鸟到大神的成神之路学习路线_me
java大神的成神之路
没有更多推荐了,

我要回帖

更多关于 java中静态方法 的文章

 

随机推荐