Flexible job shop scheduling problem (fJSP) is an extension of the classical job shop scheduling problem, which provides a closer approximation to real scheduling problems. This paper addresses the fJSP problem with three objectives: min makespan, min maximal machine workload and min total workload. We develop a new genetic algorithm hybridized with an innovative local search procedure (bottleneck shifting) for the problem. The genetic algorithm uses two representation methods to depict solution candidates of the fJSP problem. Advanced crossover and mutation operators are proposed to adapt to the special chromosome structures and the characteristics of the problem. The bottleneck shifting works over two kinds of effective neighborhood, which use interchange of operation sequences and assignment of new machines for operations on the critical path. In order to strengthen search ability, the neighborhood structure can be adjusted dynamically in the local search procedure. The performance of the proposed method is tested by numerical experiments on a large number of representative problems.