帆的博客

扬帆起航

给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等。经常使用适当的虚拟机监控和分析的工具可以加快我们分析数据、定位问题的速度。

JDK的命令行工具

JDK的安装目录bin下提供了很多工具,这些工具其实是jdk/lib/tools.jar的包装而已。

jps:虚拟机进城状况工具

jps(JVM Process Status Tool):可以列出正在运行的虚拟机进程,并显示虚拟机执行主类以及这些进程的本地虚拟机唯一ID(Local Virtual Machine IIdentifier, LVMID),这个LVMID跟系统里的PID是一致的。

阅读全文 »

内存分配

之前讲了垃圾回收器体系以及运作原理,现在来看看对象内存分配那点事儿。对象的内存分配,往大方向讲就是在堆上分配,对象主要分配在新生代的Eden区上,也可能直接分配在老年代中,并不固定,取决于使用的哪一种垃圾收集器以及虚拟机参数设置。

对象优先在Eden分配

大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够的空间进行分配时,虚拟机会发一起一次Minor GC。

阅读全文 »

哪些内存需要回收?

程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,方法或者线程结束的时候内存自然就跟着回收了,所以不需要考虑过多回收的问题。而Java堆方法区就不一样了,这部分内存的分配回收都是动态的。

Java堆内存回收

因为堆就是放对象的地方,要回收内存,首先要知道哪些对象是不可能再被任何途径使用的

引用计数法

这个算法的实现是:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器+1,当引用失效时,计数器-1。Object-C就是使用的这种方式,Java没有选用引用计数算法来管理内存,因为它很难解决对象之间相互循环引用的问题。例子如下

阅读全文 »

在Java虚拟机规范的描述中,除了程序计数器,其他几个运行时区域都有发生OutOfMemoryError异常的可能。本文有两个目的:

  1. 通过代码验证Java虚拟机规范中描述的各个运行时区域存储的内容。
  2. 希望我们在工作中遇到问题的时候能迅速判断是哪个区域的内存溢出,知道什么样的代码会导致这些区域溢出,以及出现这些异常后该如何处理。

这个图展示了如何在Idea中设置VM参数。

阅读全文 »

Java内存区域

下面从概念上介绍Java虚拟机内存的各个区域,讲解这些区域的作用、服务对象以及其中可能产生的问题,这是翻越虚拟机内存管理这堵围墙的第一步。

运行时数据区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,包含以下几个运行时数据区域。

阅读全文 »

今天开写JVM系列的学习笔记,书籍为周志明的《深入理解Java虚拟机》

走进Java

Java技术体系

Sun官方所定义的技术体系包括以下几个组成部分

  • Java程序设计语言
  • 各种硬件平台上的Java虚拟机
  • Class文件格式
  • Java API类库
  • 来自商业机构和开源社区的第三方Java类库

我们把Java程序设计语言、Java虚拟机、Java API类库这三部分统称为JDK,JDK是用于支持Java程序开发的最小环境。Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE,JRE是支持Java程序运行的标准环境。下图展示了Java技术体系所包含的内容,以及JDK和JRE所覆盖的范围。

阅读全文 »

最近遇到一个需求需要在获取URL字符串上的kv键值对,我们都知道Java Web在请求是直接用request来获取值的。如果是字符串呢,就需要正则表达式来自己截取了。
自己写代码是比较麻烦的,下面推荐用Guava工具包,2行代码就可以解决这个需求了。

1
2
3
4
5
6
private String getPara(String url, String name) {
String params = url.substring(url.indexOf("?") + 1, url.length());
Map<String, String> split = Splitter.on("&").withKeyValueSeparator("=").split(params);
return split.get(name);
}

先截取到?后面的字符串,然后再用Splitter.on("&").withKeyValueSeparator("=").split(params);就轻松的解决了~

总结

本文系统讲解了技术要点,通过学习掌握核心知识和实践方法。

Spring Cloud oauth2 开启客户端功能,并启用LoadBalanced

如果不添加以下配置,只添加@EnableOAuth2Client注解,spring cloud默认是在web环境下使用的AuthorizationCodeResourceDetails

具体代码在OAuth2RestOperationsConfiguration类中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

@Configuration
@ConditionalOnBean(OAuth2ClientConfiguration.class)
@ConditionalOnWebApplication
protected static class SessionScopedConfiguration {

@Bean
@ConfigurationProperties("security.oauth2.client")
@Primary
public AuthorizationCodeResourceDetails oauth2RemoteResource() {
AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails();
return details;
}

@Bean
public FilterRegistrationBean oauth2ClientFilterRegistration(
OAuth2ClientContextFilter filter, SecurityProperties security) {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(filter);
registration.setOrder(security.getFilterOrder() - 10);
return registration;
}

@Configuration
protected static class ClientContextConfiguration {

@Resource
@Qualifier("accessTokenRequest")
protected AccessTokenRequest accessTokenRequest;

@Bean
@Scope(value = "session", proxyMode = ScopedProxyMode.INTERFACES)
public DefaultOAuth2ClientContext oauth2ClientContext() {
return new DefaultOAuth2ClientContext(this.accessTokenRequest);
}

}

}

阅读全文 »

在项目中访问另一个微服务的时候我们可以这样用RestTemplate来调用其他服务:

1
2
3
4
@Autowired
private RestTemplate restTemplate;
RestResponse response = restTemplate.postForObject("http://user-service/user/getUser", para, User.class);

在spring cloud环境下,这个注入的restTemplate是具备了客户端负载均衡功能的,也会用到eureka服务发现功能,user-service就是服务的名称。
我的项目启用了oauth2认证。spring cloud也提供了一个OAuth2RestTemplate来很方便的调用其他服务。但是在我测试的时候一直报错UnknownHost,我猜测他肯定是没有用到loadBalanced和eureka的服务发现功能。我翻遍了官方文档也没有找到相关的说明。

Google搜了大半天后,看了作者在git也讨论过这个类loadBalanced功能之类的,还翻到一个没有什么用 @LoadBalanced注解,翻了半天源码后终于在OAuth2LoadBalancerClientAutoConfiguration这样一个类中发现了一点蛛丝马迹。

阅读全文 »

在spring cloud项目环境中配置oauth2.0认证。

http://callistaenterprise.se/blogg/teknik/2015/04/27/building-microservices-part-3-secure-APIs-with-OAuth/
可以先看看这篇文章。

我花了不少时间才把这个调通,spring cloud的版本和文档也存在不一致的地方。
以下所有的操作都基于Brixton.RC1搭建,须保持所有相关项目都引用此parent。否则会出现各种莫名其妙的错误。

1
2
3
4
5
6
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Brixton.RC1</version>
<relativePath/>
</parent>
阅读全文 »
0%